在 nunit 测试中进行手动交互吗?

Do manual interaction in nunit tests?

我正在使用 C# 和 .NET Core 中的 Nunit 对某些电子设备进行 hardware/production 测试。测试用例以不同的方式刺激硬件,作为最后的检查,我打开了一个 LED。这有点难以自动验证(没有构建一些自定义硬件),所以我想有一个手动验证步骤,让用户在 LED 是否打开时说通过或失败。这在 Nunit 中甚至可能吗?

我试过使用 Console.ReadLine()/Console.ReadKey(),但没有用。有什么方法可以实现吗?或者有其他替代方法吗?

我的另一个选择是将这个手动步骤放在 Nunit 框架之外,例如在 shell 脚本中。但是那样我就会失去结果处理等的好处。对此有什么建议吗?

当然可以破解 nuint,但这 "feature" 值得吗?我认为这会很臭并且会花费 you/your 同事更多的支持资源,因为这里没有简单的解决方法。我建议你将逻辑分成两部分:

一个用于 semi-automatic(即手测),作为简单的控制台应用程序提供专家问题和答案(一些 LED on/off?火花出来了?移动电源爆炸了?)。

另一个用于自动测试(NUnit,其他)作为简单的 dll。

这种方法的好处是,您可以 运行 在某些时候(可能是在启动时)从 semi-automatic 控制台应用程序进行自动测试,并且可以轻松地与专家进行交互。

NUnit 和其他测试框架旨在执行单元测试。

一个单位被Wikipedia定义为

Unit tests are typically automated tests written and run by software developers to ensure that a section of an application (known as the "unit") meets its design and behaves as intended.

因此,基本上,您要做的不是单元测试,它更像是一个集成测试,因为您要测试解决方案的两个独立的不同区域是否协同工作,即软件和硬件。

因此,这并不是真正设计 NUnit 或类似单元测试框架的目的。

因此,使用NUnit来测试软件部分,然后看看集成测试的其他选项,这可能意味着编写其他工具,甚至只是手动完成!

NUnit 并不能真正与控制台一起工作——事实上你不应该用它来测试需要 user-interaction 的东西——这将是一个 integration-test。虽然你可以实现它:

if(Double.TryParse(Console.ReadLine(), out var ok) && ok)
    Assert.Pass("Test OK");
else
    Assert.Fail("Test failed");

我怀疑这是个好主意,因为它不可能实现自动化 - 这是 unit-tests 的 main-goals 之一。

因为你想要的似乎是 NUnit 的一些标记,无论你的测试是否成功,我总是使用 Assert.Inconclusive 来指示用户必须手动解释结果(例如文件) 某种程度上来说。事实上,对于此类测试,您可以完全忽略 NUnit,只需启动您的应用程序并让您的用户照常使用它。

另外为可测试的所有内容写unit-tests。如果需要重构您的代码以获得可测试的内容,即从您的 UI.

中提取 business-logic