如何正确使用 OneTimeSetUp 进行 NUnit 测试

How to properly use OneTimeSetUp for NUnit Tests

我有一个充满未解数独谜题的文本文件。我想用我的算法解决每个难题,并与已经工作的求解器(来自 Nuget)进行比较。为此,我想使用 NUnit 并进一步创建一个 OneTimeSetUp 将每个拼图添加到一个列表中,这样我就可以迭代它并解决它。到目前为止,我的方法是这样的:

namespace SudokuSolverApp.SudokuSolverTests
{
    [SetUpFixture]
    public class Config
    {
        [OneTimeSetUp]
        public List<string> Init()
        {
            var sudokuPuzzles = new List<string>();
            var text = System.IO.File.ReadAllLines("/");
            for (var index = 0; index < text.Length; index++)
            {
                var puzzle = text[index];
                sudokuPuzzles.Add(puzzle);
            }

            return sudokuPuzzles;
        }
    }
    
    [TestFixture]
    public class SudokuUnitTests
    {
        public void TestAllSolutions()
        {
            foreach (var puzzle in sudokuPuzzles)
            {

                
            }
        }
    }
}

然而,这不起作用,因为程序不识别最后一个forloop中的sudokuPuzzles变量。在我的案例中,正确编写的单元测试会是什么样子?

正如@funatparties 指出的那样,您正试图在测试 class 中访问一个 non-existent 变量。还有其他问题,我会列出

  1. 如前所述,没有变量SudokoUnitTests.sudokuPuzzles,所以你的程序无法编译。

  2. 即使有这样一个变量,也没有理由期望 NUnit 会在调用您的程序之前设置它。阅读 NUnit 文档!

  3. OneTimeSetUp 方法没有 return 任何东西 - 它们是无效的。再次:文档!

  4. SetUpFixtures 的目的不是为测试提供数据,而是为了设置支持测试的环境。它们用于诸如创建和填充数据库或打开您要在测试中使用的一些大型硬件之类的事情。 (文档中可能不太清楚。)

上面有很多东西甚至不应该编译,这让我很奇怪。您使用的是真正的旧版 NUnit,它甚至不知道 SetUpFixture 吗?如果真是这样,那就默默无视了。

备选方案:

  1. 在您的测试夹具中使用 OneTimeSetUp 方法,而不是 SetUpFixture。然后,您可以将拼图列表保存为 class 的成员,并从每个测试中访问它。

  2. 如果您只有一种测试方法,它会循环遍历每个谜题,那么您不妨使用 SetUp 方法而不是 OneTimeSetUp。

  3. 作为更高级的方法,您可以对每个谜题进行单独测试,将谜题文本作为参数。那就是我会做的。但是在这样做之前你需要了解更多关于 NUnit 的知识,所以我建议保存它以备后用。