【问题标题】:Nunit-C#: run specific Tests through codingNunit-C#:通过编码运行特定的测试
【发布时间】:2015-09-29 02:45:19
【问题描述】:

我正在使用 Selenium 和 C# 进行自动化,我想通过代码调用 NUnit,如下所示:

CoreExtensions.Host.InitializeService();
TestPackage testPackage = new TestPackage(@"D:\Automation\bin\Debug\Test.dll");
RemoteTestRunner remoteTestRunner = new RemoteTestRunner();
remoteTestRunner.Load(testPackage);
//TestFilter filter = new NameFilter(new TestName() { Name = "Test1" });
TestResult testResult = remoteTestRunner.Run(
    new NullListener(),
    TestFilter.Empty,
    false,
    LoggingThreshold.Off
); 

我可以使用如下类别过滤器运行测试

remoteTestRunner.Run(
    new NullListener(),
    new CategoryFilter("MyCat"),
    false,
    LoggingThreshold.Off
);

但我想执行特定的测试。如何设置套件过滤器?我尝试了以下方法,但它不起作用:

TestFilter filter = new NameFilter(new TestName() { Name = "Test1" }); 
TestResult testResult = remoteTestRunner.Run(
    new NullListener(),
    filter,
    false,
    LoggingThreshold.Off
);

如何运行特定测试以及如何通过代码传递参数?

【问题讨论】:

  • 有什么解决办法吗?
  • 如果 NUnit 无法实现,请向我推荐替代方案。
  • 你知道如何使用 TestName 过滤器来做到这一点吗?我也在尝试相同的方法,但它不断返回不确定?

标签: c# nunit


【解决方案1】:

此示例代码应该让您了解开始循环测试并选择要运行的测试所需执行的操作。我已经使用了几个 0 的数组索引,您应该在其中循环。

其中的要点是,您必须先实际加载测试,然后才能开始尝试单独运行它们,因为测试需要有一个唯一的 TestId,只有在加载后才会设置。以下代码工作并运行测试框架中第一个 testfixture 中的第一个测试。它还会扫描所有测试名称,以便您根据某些条件显示或运行

CoreExtensions.Host.InitializeService();
TestSuiteBuilder builder = new TestSuiteBuilder();
TestPackage testPackage = new TestPackage(@"path.to.dll");
RemoteTestRunner remoteTestRunner = new RemoteTestRunner();
remoteTestRunner.Load(testPackage);
TestSuite suite = builder.Build(testPackage);
TestSuite test = suite.Tests[0] as TestSuite;
var numberOfTests = ((TestFixture)test.Tests[0]).TestCount;

foreach (TestMethod t in ((TestFixture)test.Tests[0]).Tests)
{
    Console.WriteLine(t.TestName.Name);
}

TestName testName = ((TestMethod)((TestFixture)test.Tests[0]).Tests[0]).TestName;
TestFilter filter = new NameFilter(testName);
TestResult result = test.Run(new NullListener(), filter);
ResultSummarizer summ = new ResultSummarizer(result);
Assert.AreEqual(1, summ.ResultCount);

【讨论】:

  • 梦想成真,谢谢。我现在也可以查看结果并报告失败的原因等。
  • 您好@ED-209,感谢您的回复。我正在使用下面的代码来执行选定的测试,它的工作但是,测试执行的次数比提到的要多。 SimpleNameFilter filter = new SimpleNameFilter(); foreach(DT.Rows 中的 DataRow DR){ string Test = ...;过滤器。添加(测试); } CoreExtensions.Host.InitializeService(); TestPackage testPackage = new TestPackage(@"..........dll"); RemoteTestRunner remoteTestRunner = new RemoteTestRunner(); remoteTestRunner.Load(testPackage); TestResult 结果 = remoteTestRunner.Run(new NullListener(), filter, true, LoggingThreshold.All);
  • 请给出执行选定测试的方式,选定的次数。提前致谢。
  • @Kishorereddy 首先,我使用了一个 NameFilter,它采用了一个 TestName 对象。其次,我通过 TestMethod 对象而不是 RemoteTestRunner 运行测试。我并不是说这是不可能的,但我知道它是有效的,因为这是我们用来运行个人测试的方法(必要时不止一次)。我相信我们首先按照您的方式进行了尝试,然后遇到了所有返回“不确定”的测试
  • @Kishorereddy 很高兴听到您的测试正在运行,因为它们正在执行多次。这可能是由于在多个功能或套件中使用了相同的测试名称吗?也许 NUnit 不知道该选择哪一个。我以前没有遇到过这个问题,所以真的不知道为什么会发生这种情况。我假设 DataRow 只是一个字符串测试名称列表,也许你在这里可能有一些重复?
【解决方案2】:

这是我的工作代码....

    SimpleNameFilter filter = new SimpleNameFilter()

    foreach (DataRow DR in DT.Rows)
    {
    string Test = "FullNameOftheTest";
    filter.Add(Test); 
    }

  CoreExtensions.Host.InitializeService();
  TestPackage testPackage = new TestPackage(@"D:\Test\Test.dll");
  RemoteTestRunner remoteTestRunner = new RemoteTestRunner();
  remoteTestRunner.Load(testPackage);
  TestResult result = remoteTestRunner.Run(new NullListener(), filter, true,          LoggingThreshold.All);
  ResultSummarizer summaryResults = new ResultSummarizer(result);

感谢大家的支持, 基肖尔。

【讨论】:

  • NUnit 是否记录了这些内容?我想自己实现这样的东西,但我宁愿 RTFM 看看有哪些选项对我开放
  • 我们不记录它,因为这些都是内部方法,随着版本的不同而变化。 NUnit 一直因缺乏已发布的 API 来运行测试而受苦。 NUnit 3.0 提供了这样一个 API。粗略的文档可在github.com/nunit/dev/wiki/Test-Engine-API 获得,完成后将移至github.com/nunit/docs/wiki 下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-03
  • 1970-01-01
  • 2023-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-21
相关资源
最近更新 更多