使用xunit或nunit作为测试运行器框架

时间:2011-06-11 22:22:44

标签: .net nunit xunit

我将从一个问题开始。我有一个小图书馆。它遍历文本文件中的URL列表,并根据url返回200创建断言。

目标是让像Reshaprer,Testdriven.net这样的测试运行器或像team city或者hudson这样的CI服务器将这些断言作为测试来接收。

我的问题是如何扩展/构建xunit或nunit以从其他源运行测试? 例子很棒。

更新 使事情更清楚一点。 我应该能够在xunit / nunit附带的测试运行器中加载dll并运行测试。

如何填充网址列表是非常动态的。根据某些事情,可以创建更多URL。因此,数据列表不是一种选择。

3 个答案:

答案 0 :(得分:1)

如果你的意思是如何以编程方式运行NUnit测试(而不是使用提供的NUnit运行器之一),那么它实际上非常简单:

using System;
using NUnit.Core;
using NUnit.Framework;
using MyProject.Tests;  /* assuming MyTestFixture is defined in this project/assembly */

namespace TestRunner.DemoApp {
    class Program {

    static void Main(string[] args) {
        var builder = new TestSuiteBuilder();
        var testAssemblyLocation = typeof(MyTestFixture).Assembly.Location;
        var package = new TestPackage(testAssemblyLocation);
        var suite = builder.Build(package);
        Console.ForegroundColor = ConsoleColor.White;
        Console.WriteLine("Running tests from " + testAssemblyLocation;
        Console.WriteLine("Testing against " + ConfigurationManager.AppSettings["HostNameSuffix"]);
        var result = suite.Run(new NullListener(), TestFilter.Empty);
        switch (result.ResultState) {
            case ResultState.Success:
                Console.ForegroundColor = ConsoleColor.Green;
                Console.WriteLine("Pass.");
                break;
            case ResultState.Error:
            case ResultState.Failure:
                Console.ForegroundColor = ConsoleColor.Red;
                DrawResults(result.Results, r => r.ResultState == ResultState.Error || r.ResultState == ResultState.Failure);
                break;
        }

        static void DrawResults(IList results, Func<TestResult, bool> include) {
            foreach (var obj in results) {
                var result = obj as TestResult;
                if (result == null) continue;
                if (result.Results != null && result.Results.Count > 0) {
                    DrawResults(result.Results, include);
                } else if (include(result)) {
                    Console.WriteLine(result.Name);
                    Console.WriteLine(result.Message);
                    Console.WriteLine(result.ResultState);
                    Console.WriteLine(result.StackTrace);
                    Console.WriteLine(String.Empty.PadLeft(Console.WindowWidth, '='));
                }
            }
        }
    }
}

答案 1 :(得分:1)

使用xUnit,您只需要实现ITestRunner接口,即:

public class MyTestRunner : ITestRunner
{
    // Methods
    public MyTestRunner();
    public static TestRunState RunAssembly(TestRunner runner);
    public static TestRunState RunClass(TestRunner runner, Type type);
    public static TestRunState RunClassWithInnerTypes(TestRunner runner, Type type);
    public static TestRunState RunMethod(TestRunner runner, MethodInfo method);
    TestRunState ITestRunner.RunAssembly(ITestListener listener, Assembly assembly);
    TestRunState ITestRunner.RunMember(ITestListener listener, Assembly assembly, MemberInfo member);
    TestRunState ITestRunner.RunNamespace(ITestListener listener, Assembly assembly, string ns);
}

有关实现的详细信息,请获取xUnit的源代码,并查看示例运行器。

答案 2 :(得分:0)

您可以使用NUnit中的TestCaseSourceAttribute来运行动态测试。