Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 使用SetUp方法设置测试的输出文件_Unit Testing_.net Core_Nunit - Fatal编程技术网

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

Unit testing 使用SetUp方法设置测试的输出文件,unit-testing,.net-core,nunit,Unit Testing,.net Core,Nunit,您好,我有一个类充满了测试用例-s。我想根据每个测试用例的标识符或名称预先设置输出文件 class SetTests { [SetUp] public async Task WriteHeader() { TestContext.WriteLine("${something belonging to current test}"); } [TestCase] public void Writ

您好,我有一个
充满了
测试用例
-s。我想根据每个
测试用例
的标识符或名称预先设置输出文件

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");
        }
    }
我希望在每个
testcase
之前调用的
WriteHeader
方法将当前测试
Output
文件名设置为可以识别当前测试的内容(
Methodinfo.name
或任何其他唯一属性),并将其作为头写入文件中

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

WriteContent.txt

//----ID/name/ of test whatever-----
Myfirst test
WriteAnotherContent.txt

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

p.S我说了
无论什么
,因为我不知道在
设置
方法中,你能获得什么
元数据
信息,这些信息是关于将要运行的测试的。

无法导致
测试上下文的输出。WriteLine
转到任何文件,因为它是定义为写入NUnit创建的XML输出报告。这同样适用于
Console.WriteLine
,它被NUnit截取,也包含在XML输出中

为了让您的测试在其他地方写入,即写入一个特殊文件,您必须自己打开该文件并写入该文件。所以问题是双重的

  • 如何确定在安装程序中写入哪个文件

  • 如何确保每个测试都获得该信息并写入正确的文件

  • 如果没有并行运行的测试,这两种方法都很容易,否则就更难了

    非并行方法

    TestContext.CurrentContext.Test.Name
    提供当前测试的名称。它可以在安装、拆卸和测试本身中使用。当按顺序运行测试时, 安装、测试和拆卸一个接一个地运行,中间没有任何内容。您可以在设置中的成员字段中设置信息,并在测试和拆卸中使用这些信息

    示例:在安装程序中,构造文件名,创建文件名,并在字段中保存TextWriter以供测试使用。在测试中,给那个作者写信。在拆卸中,将其关闭

    另一个示例:在安装程序中,创建一个字符串编写器(或只是一个StringBuilder)来保存输出。在测试中,写入编写器(或附加到生成器)。在TearDown中,找出要使用的文件名并写出所有内容

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

    平行进近

    如果测试要并行运行,则不能在fixture实例中更改任何信息。每个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
    

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