我将从一个问题开始。我有一个小图书馆。它遍历文本文件中的URL列表,并根据url返回200创建断言。
目标是让像Reshaprer,Testdriven.net这样的测试运行器或像team city或者hudson这样的CI服务器将这些断言作为测试来接收。
我的问题是如何扩展/构建xunit或nunit以从其他源运行测试? 例子很棒。
更新 使事情更清楚一点。 我应该能够在xunit / nunit附带的测试运行器中加载dll并运行测试。
如何填充网址列表是非常动态的。根据某些事情,可以创建更多URL。因此,数据列表不是一种选择。
答案 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
来运行动态测试。