我有以下设置来并行运行我的测试(对于Selenium测试):
[TestClass]
public class ParallelTests
{
[TestMethod]
public void TestAllParallel()
{
var testActions = Assembly.GetExecutingAssembly().GetTypes()
.Where(t =>
t.GetCustomAttribute<CompilerGeneratedAttribute>() == null &&
t.GetCustomAttribute<TestClassAttribute>() != null)
.Select(t => new Action(() => RunTest(t)))
.ToArray();
System.Threading.Tasks.Parallel.Invoke(testActions);
}
private static void RunTest(Type test)
{
var instance = Activator.CreateInstance(test);
ExecuteTestMethods(instance);
}
private static void ExecuteTestMethods(object instance)
{
var testMethods = instance.GetType().GetMethods()
.Where(m =>
m.GetCustomAttribute<TestMethodAttribute>(false) != null &&
m.GetCustomAttribute<IgnoreAttribute>(false) == null)
.ToArray();
foreach (var methodInfo in testMethods)
{
methodInfo.Invoke(instance, null);;
}
}
}
虽然我的Jenkins服务器上的测试结果报告只显示已运行一个测试,但此工作正常。我想在报告中看到TestAllParallel()
已经运行的所有测试。
这可能吗?我想也许可以在运行时将一个方法作为测试添加到MSTest。
答案 0 :(得分:1)
我担心无法添加方法,但您可以报告该特定测试中所有运行的结果。首先使用类似于下面代码的方法执行测试方法,以便保存运行结果:
private static void ExecuteMethod(MethodInfo method, object instance)
{
try
{
method.Invoke(instance, null);
threadSafeStringBuilder.Append("Test: " + method.Name + " passed");
}
catch (UnitTestAssertException utException)
{
threadSafeStringBuilder.Append("Test: " + method.Name + " assertion failed" + utException.Message);
_allPassed = false;
}
catch (Exception ex)
{
threadSafeStringBuilder.Append("Test: " + method.Name + " exception: " + ex.Message");
}
}
稍后在testAllParallel:
public void TestAllParallel()
{
//...
System.Threading.Tasks.Parallel.Invoke(testActions);
if(_allPassed){
Assert.IsTrue(true, "All tests Passed:\n"+threadSafeStringBuilder.ToString());
}else{
Assert.Fail("Some tests failed:\n"+threadSafeStringBuilder.ToString());
}
)
请记住,这只是一个想法,而不是完全正常工作的代码。特别是.net中没有ThreadSafeStringBuilder
所以你可能需要实现自己的或者使用一些库。
答案 1 :(得分:0)
使用System.Diagnostics.WriteLine
还有另一个系统也可以正常工作。它将输出您在其中写入的任何内容。这是另一个讨论它的SO问题:Add custom message to unit test result
该线程中一个非常有趣的观点是,如果没有状态消息,有人可能会通过删除所有测试内容来“破坏”您的测试,以便它通过,因此您可能需要在正常测试中发送诊断信息。
答案 2 :(得分:0)
我不确定我是否正确理解了您的问题,但我认为您应该稍微改变一下您的解决方案以克服这一挫折。 尝试在Jenkins中构建一个只执行命令行的项目,该命令可以使用MSTest命令执行所有测试。 你可以看到如何做到here