如何在单元测试中建模并发?

Dar*_*rio 14 c# concurrency unit-testing visual-studio

我对单元测试很陌生,目前正在尝试使用Visual Studio的测试工具.

我的问题是如何在这些测试中定义关于并发行为的断言.例如,给定一个BoundedChan<T>实现有界通道的类,我如何指定测试

  1. " channel.Send不会阻止"或
  2. "如果超出了频道的容量,channel.Send将阻止直到读取一个值"

编写这些断言是否有优雅的解决方案?

LBu*_*kin 6

这是一篇讨论该主题的博客文章 ; 它专注于NUnit.

不幸的是,并发仍然是单元测试的一个领域,很容易构建.这不是一个简单的问题,仍然需要在测试中实现一些自己的同步和并发逻辑.

对于您提供的示例,可能无法编写最终证明某个方法在某些条件下会阻止或不会阻塞的测试.您可以通过首先创建您希望阻塞行为的最坏情况来获得某种程度的置信度 - 然后编写测试以确定是否发生这种情况.

  • 链接已死,但Wayback Machine支持您。Dan Barvitsky的原始文章:https://web.archive.org/web/20140822013404/http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/12/techniques-for-testing-concurrent -code-in-nunit.aspx。他的后续帖子:https://web.archive.org/web/20100526080326/http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/15/my-solution-for-unit -testing-concurrent-code-in-nunit.aspx中。 (2认同)

Dre*_*lls 5

这个问题可能会导致足够的内容来填满一本书。

一般来说,我不建议为并发场景向您的类添加单元测试。通过实践,我认为您会了解到自动化单元测试有一个或多个“最佳点”——并且将您的精力集中在这些领域(并在其他领域使用其他实践)会产生更好的投资回报率。

但是您的课程似乎与并发有关(根据提供的信息无法确定),因此这可能是您真正想要并发模拟测试的情况。

如果您愿意,您可以(据我所知)在单元测试中启动多个线程。但可能有更简单的方法。考虑利用Compose Method模式。当我们讨论这个主题时——这种模式对于有效的单元测试非常重要,而不仅仅是并发。