vstest.console.exe执行模型和隔离行为

时间:2017-03-03 20:19:31

标签: .net execution isolation vstest vstest.console.exe

我试图确定在编写将在vstest.console.exe下运行的测试时应该考虑的因素。

示例1 :让我们说我有两个测试,这两个测试都依赖MyClass.Singleton.Counter的值为零。现在让我们说我们聘请了一位新的实习生,在他写的测试中无意中增加了这个价值。如果这个新测试在旧的两个单元测试之前运行。如果测试在同一个过程中运行(并且没有重置计数器值),那么这两个单元测试将失败。

示例2 :假设我有两个针对同一个数据库的集成测试。这两个测试都记录了DB中存在的计数器的值,递增计数器,然后从DB读取计数器,断言它的值比最初读取的值高1。如果这两个测试并行运行,我们就会遇到竞争条件。

最终目标是尝试理解开发人员在编写将在vstest.console.exe下运行的测试时应该记住的注意事项,它的执行模型是什么?

注意:我对最佳做法不感兴趣,只是在影响测试结果的方式中了解vstest.console.exe的执行模型。

相关注意事项:

  1. 如果将project1.dllproject2.dll传递给控制台,并且每个都依赖于依赖程序集的冲突版本,那么项目测试文件将如何成功执行?
  2. 每个测试文件(即dll)都有自己的进程吗?
  3. 每个测试文件(即dll)是否在单个进程中给出了自己的AppDomain?
  4. 执行每个测试文件的当前工作目录是什么?
  5. 测试是连续执行还是并行执行?
  6. 测试执行顺序是否具有确定性?
  7. 不同的测试适配器对相关行为的控制程度是多少?
  8. 没有指定.runsettings文件或测试适配器时的默认行为是什么?
  9. 相关背景资料:

    (1)/InIsolation的{​​{3}}表明它"在一个孤立的过程中运行测试。"

    我从上面可以推断出,创建了一个流程,其中传递给测试运行器的 ALL 测试文件将会执行,但这可能不准确。

    (2)vstest.console.exe可以接受多个测试"文件"在命令行上,这些DLL可能引用不同目录中的不同项目。

    (3)通过提供*.runsettings文件,可以使用测试适配器来执行测试。

1 个答案:

答案 0 :(得分:0)

测试应该是相互独立的,你的例子1也告诉你为什么静态是糟糕的设计。

将静态更改为具有静态类生命周期的实例变量。可能所有依赖注入库都可以做到这一点。

在测试中,他们应该使用两个独立变量进行模拟,每个变量的初始值为0,以测试行为。

对于示例2,此处测试也应该是独立的。每个应该在测试套件/类 - [TestInitialize]方法的开头准备DB,并恢复到[TestCleanup]中的已知状态。