如何在MSTest中的测试执行期间添加非测试方法作为测试?

时间:2016-03-31 11:42:29

标签: c# selenium jenkins mstest

我有以下设置来并行运行我的测试(对于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。

3 个答案:

答案 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