使用SetUp方法设置测试的输出文件

时间:2018-10-12 08:32:11

标签: unit-testing .net-core nunit

您好,我有一个class-s的testcase,我想根据其标识符或名称预先设置每个testcase的输出文件。

class SetTests {
        [SetUp]
        public async Task WriteHeader() {
            TestContext.WriteLine("${something belonging to current test}");
        }

        [TestCase]
        public void WriteContent() {
            TestContext.WriteLine("Myfirst test");
        }
        [TestCase]
        public void WriteAnotherContent() {
            TestContext.WriteLine("mysecond test");
        }
    }

我希望在每个WriteHeader之前调用的testcase方法将当前测试Output的文件名设置为可以标识当前测试的名称(Methodinfo.Name或其他任何名称其他独特的属性),并将其也作为标头写入文件中。

在上面的示例中,我希望在运行测试后拥有:

WriteContent.txt

//----ID/name/ of test whatever-----
Myfirst test

WriteAnotherContent.txt

//------ID/name/ of test whatever------
  my second test

PS 我之所以说whatever是因为我不知道您可以在metadata方法中获得关于SetUp的信息,该信息将在之后进行。它。

1 个答案:

答案 0 :(得分:1)

根本没有办法使TestContext.WriteLine的输出进入任何文件,因为它被定义为写入NUnit创建的XML输出报告。 Console.WriteLine也是一样,它被NUnit拦截并且也包含在XML输出中。

要使测试写入其他位置(即写入特殊文件),您必须自己打开该文件并写入文件。所以问题是双重的...

  1. 如何确定要在SetUp中写入哪个文件。

  2. 如何确保每个测试都能获取该信息并将其写入正确的文件。

如果没有并行运行的测试,两者都很容易,否则会更困难。

非并行方法

TestContext.CurrentContext.Test.Name为您提供当前测试的名称。它在SetUp,TearDown和测试本身中可用。当测试按顺序运行时, 依次运行SetUp,Test和TearDown,两者之间没有任何作用。您可以在“设置”的成员字段中设置信息,并在测试和拆卸中使用它们。

示例:在SetUp中,构造文件名,创建它,并将TextWriter保存在一个供测试使用的字段中。在测试中,写信给那个作家。在TearDown中,将其关闭。

另一个示例:在SetUp中,创建一个字符串编写器(或只是一个StringBuilder)来保存输出。在测试中,写给编写者(或附加到生成器)。在TearDown中,找出要使用的文件的名称,然后将所有内容写出。

注意:如果并行运行测试,此方法将不起作用。实例中保存的所有信息都可能随时被同一类中的另一个测试覆盖。要使用这种方法,您应该将整个灯具(或每个测试)标记为[NonParallelizable]

并行方法

如果要并行运行测试,则夹具实例中的任何信息均不得更改。每个write语句必须弄清楚要写入和附加到该文件的文件。最好的方法是通过编写方法进行。它应该使用一个锁来确保两个线程不能同时输入它。伪代码...

Lock based on the fixture instance or an object created in the constructor.
    Use test name to get file name
    Open the file for appending
    Write to the file
    Close the file

如果您不使用并行执行,那么使用更简单,非并行的方法没有什么错。但是,如果这样做,请确保将测试标记为不可并行化。否则,您可能会冒着某个人(甚至是您自己健忘的自我)在以后出现的风险,并在更高级别添加一个属性,该属性使测试默认为并行运行。