Использование xunit или nunit в качестве среды для выполнения тестов

Я начну с проблемы. У меня есть небольшая библиотека. Он просматривает список URL-адресов в текстовых файлах и создает утверждения в зависимости от того, возвращается ли URL-адрес 200 или нет.

Цель состоит в том, чтобы сделать тест-бегуна, такого как Reshaprer, Testdriven.net, или CI-сервером, например, Team City или Hudson, для того, чтобы принимать утверждения в качестве тестов.

У меня вопрос, как мне расширить / собрать на xunit или nunit для запуска тестов из другого источника? Примеры были бы отличными.

Обновление Чтобы сделать вещи немного более понятными. Я должен быть в состоянии посмотреть загрузку DLL в тестовом средстве, которое поставляется с xunit / nunit и запустить тест.

Как заполняется список URL-адресов, очень динамично. В зависимости от определенных вещей может быть создано больше URL. Таким образом, список данных не вариант.

3 ответа

С 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 и взгляните на примеры бегунов.

Если вы имеете в виду, как вы можете запускать тесты 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, '='));
                }
            }
        }
    }
}

Вы можете использовать TestCaseSourceAttribute в NUnit для запуска динамических тестов.

Другие вопросы по тегам