NUnit - 并行对两个单独的测试进行单元测试

NUnit - Unit testing two separate tests in parallel

提问人:user4779 提问时间:11/15/2022 更新时间:11/18/2022 访问量:263

问:

我知道 NUnit 并行运行测试,这不是这个问题的确切内容。在单个测试中,我可以在不同的端口上使用 TcpClient 打开两个本地套接字连接,这些连接可以在同一单元测试中相互通信。问题是地址空间当然是由执行单元测试的线程共享的,所以它不会按照我想要的方式模拟通过网络进行的通信。

如果我有一个带有一个 TcpClient 的名为 Test1 的测试,并且在它运行时,我与另一个 TcpClient 一起运行 Test2,在这两个测试中,我可以让两个单元测试相互通信和通信 - 测试我设计的协议具有单独的地址空间,这确实给了我想要的网络模拟, 并允许我进行适当的测试断言。

现在的问题是,有没有办法自动执行此操作?我希望有一个可以运行 Test1 和 Test2 的测试,其中这两个测试都通过各自的套接字进行通信,而不是并行手动启动它们。

C# .NET NUnit 骑手

评论

0赞 PMF 11/18/2022
为什么需要分隔地址空间?是否涉及任何静态变量?
0赞 user4779 11/18/2022
@PMF 有一些全局变量。但我想在技术层面上没有必要,但我只想让所有东西都作为单独的进程运行,这样我就不会意外地依赖内存中的任何共享数据——测试非常广泛

答:

3赞 PMF 11/18/2022 #1

NUnit 不是为在不同的进程中运行测试而设计的(据我所知,任何其他单元测试框架也没有)。它旨在在同一进程中启动尽可能多的测试,以提高性能(创建进程的成本很高)。

当然,这并不意味着不可能做到这一点,但它不是 NUnit 本身的领域。这个问题没有提供太多关于测试结构的信息,但我假设有一个用于服务器的测试程序集和另一个用于客户端的测试程序集。只有当它们同时运行时,测试才会起作用。

我将继续创建第三个测试程序集,该程序集仅启动其他两个测试程序集,实际上是手动创建进程,例如启动

dotnet test ServerUnitTests.dll
dotnet test ClientUnitTests.dll

[“集成测试”在这里会更好,但这是一个细节]

评论

0赞 user4779 11/21/2022
嗨@PMF谢谢你的回答。在我的问题中,您建议进行哪种集成测试?一个普通的非测试项目,有这样的测试,通过抛出异常来完成断言?或者你会建议我仍然将 NUnit 与你描述的不同程序集一起使用?只是好奇什么被视为最佳实践。谢谢
0赞 PMF 11/21/2022
我不太习惯客户端/服务器应用程序,所以我可能不适合寻求最佳实践。但我会做上面这样的事情。但是,让我感到困惑的是:您真的也在服务器端运行不同的测试吗?对于这种情况,我希望“正常”启动服务器,然后在其上运行客户端测试。在客户端测试运行时,您无法运行启动和停止服务器的测试(例如,使用不同的配置)。
0赞 user4779 11/21/2022
这一切都发生在本地,两个套接字连接。从本质上讲,我是在同一台机器上模拟服务器,只是在不同的端口上
1赞 PMF 11/21/2022
好吧,这是有道理的,但是您可能不想用它们来启动服务器,而只想用 .dotnet testdotnet run myserver.dll <configuration options>
0赞 Ankit Jasuja 11/18/2022 #2

我认为这是不可能的,您可以决定哪个测试应该在另一个测试之后运行,所以基本上是顺序。但通常,测试不需要并行运行。