如何阻止NUnit ITestRunner?

如何阻止NUnit ITestRunner?,nunit,Nunit,使用nunit.engine 3.10.0,我无法停止异步运行的ITestRunner。TestPackage设置为在本地执行,即在进程内和当前AppDomain中执行。在第二次测试之后,不会像预期的那样启动更多的测试,但是while循环永远不会结束 publicstaticvoidmain(字符串[]args) { //2个组件x 2个测试夹具每个x 2个测试每个=8个测试用例 字符串[]testAssemblyFileNames={TestAssemblyFileName1,TestAsse

使用nunit.engine 3.10.0,我无法停止异步运行的
ITestRunner
TestPackage
设置为在本地执行,即在进程内和当前AppDomain中执行。在第二次测试之后,不会像预期的那样启动更多的测试,但是while循环永远不会结束

publicstaticvoidmain(字符串[]args)
{
//2个组件x 2个测试夹具每个x 2个测试每个=8个测试用例
字符串[]testAssemblyFileNames={TestAssemblyFileName1,TestAssemblyFileName2};
string assemblyDirectory=Path.GetDirectoryName(Uri.UnescapeDataString(
新的UriBuilder(Assembly.getExecutionGassembly().CodeBase.Path));
//Nunit 3.10.0
var minVersion=新版本(“3.4”);
ITestEngine testEngine=TestEngineActivator.CreateInstance(minVersion);
//配置执行的测试包
//在当前进程和当前域中
var testPackage=新的testPackage(testassemblyfilename);
testPackage.AddSetting(EnginePackageSettings.ProcessModel,“InProcess”);
testPackage.AddSetting(EnginePackageSettings.DomainUsage,“无”);
testPackage.AddSetting(EnginePackageSettings.DisposeRunners,“True”);
testPackage.AddSetting(EnginePackageSettings.WorkDirectory,assemblyDirectory);
ITestRunner testRunner=testEngine.GetRunner(testPackage);
//准备停止测试运行程序的侦听器
//第二次测试开始时
const bool StopAfterSecondTest=真;
int testStartedCount=0;
var listener=new MyTestEventListener();
listener.TestStarted+=(发送方、事件参数)=>
{
testStartedCount++;
如果(StopAfterSecondTest&&testStartedCount==2)
{
testRunner.StopRun(强制:true);
}
};
var testFilterBuilder=newtestfilterbuilder();
TestFilter TestFilter=testFilterBuilder.GetFilter();
ITestRun testRun=testRunner.RunAsync(监听器,testFilter);
布尔基宁;
int loopCount=0;
做
{
bool completed=testRun.Wait(500);
bool running=testRunner.IsTestRunning;
keepRunning=!已完成并正在运行(&R);
loopCount++;
}同时(继续修剪);
WriteLine($“循环计数:{loopCount}”);
XmlNode resultNode=testRun.Result;
Console.WriteLine(resultNode.InnerText);
Console.ReadKey();
}
私有类MyTestEventListener:ITestEventListener
{

私有常量字符串TestCaseStartPrefix=“您不能从测试内部执行此操作。您的侦听器是在测试本身的上下文中执行的。因此,明确禁止侦听器尝试更改测试结果。此外,事件会被缓冲,在这种情况下,在测试运行完成之前,甚至可能不会接收到事件

StopRun由主运行程序本身调用,通常由一些用户输入触发

您还应该注意这个问题:它会阻止
StopRun(true)
在任何情况下工作。它已在PR中修复,但尚未出现在框架的任何版本中。您必须使用框架的最新开发版本或切换到
StopRun(false)

根据@Charlie的命令,以下是如何修改代码以停止所有线程:

publicstaticvoidmain(字符串[]args)
{
//2个组件x 2个测试夹具每个x 2个测试每个=8个测试用例
//每个测试用例包括200毫秒的延迟
字符串[]testAssemblyFileNames={TestAssemblyFileName1,TestAssemblyFileName2};
string assemblyDirectory=Path.GetDirectoryName(Uri.UnescapeDataString(
新的UriBuilder(Assembly.getExecutionGassembly().CodeBase.Path));
//Nunit 3.10.0
var minVersion=新版本(“3.4”);
ITestEngine testEngine=TestEngineActivator.CreateInstance(minVersion);
//配置执行的测试包
//在当前进程和当前域中
var testPackage=新的testPackage(testassemblyfilename);
testPackage.AddSetting(EnginePackageSettings.ProcessModel,“InProcess”);
testPackage.AddSetting(EnginePackageSettings.DomainUsage,“无”);
testPackage.AddSetting(EnginePackageSettings.DisposeRunners,“True”);
testPackage.AddSetting(EnginePackageSettings.WorkDirectory,assemblyDirectory);
ITestRunner testRunner=testEngine.GetRunner(testPackage);
var listener=newteststartListener();
var testFilterBuilder=newtestfilterbuilder();
TestFilter TestFilter=testFilterBuilder.GetFilter();
ITestRun testRun=testRunner.RunAsync(监听器,testFilter);
//等待第一个测试用例已经启动
while(listener.Count<1)
{
睡眠(50);
}
bool-keepRunning=true;
同时(继续修剪)
{
int testStartedCount=listener.Count;
testRunner.StopRun(强制:false);
WriteLine($“{GetTimeStamp()},在{testStartedCount}测试用例之后停止请求。”);
//等待的时间少于完成单个测试所需的时间
bool completed=testRun.Wait(100);
bool running=testRunner.IsTestRunning;
WriteLine($“{GetTimeStamp()}已完成:{Completed},正在运行:{running}”);
keepRunning=!已完成并正在运行(&R);
}
listener.WriteReportsTo(Writer);
XmlNode resultNode=testRun.Result;
WriteLine(“测试结果:”);
resultNode.WriteContento(ResultWriter);
Console.ReadKey();
}
私有类TestStartListener:List,ITESventListener
{

private const string TestCaseStartPrefix=“是的,在我的实际应用程序中,它是由用户输入触发的;显示的测试应用程序只是为了演示效果。它们都会做出反应,不再启动更多测试(不再调用侦听器),但不要停止,也不允许我获取结果。在测试应用程序中,我可以将
testRunner.StopRun
移出侦听器,并以相同的行为移动到
Main
方法中。还有其他吗