我们有一个利用缓存(依赖于静态数据)的批处理项目。不幸的是,该项目的单元测试在同一解决方案中混乱了其他单元测试(因为静态数据),因此我需要将批处理单元测试与所有其他单元测试隔离开来。我们工作的框架/组织非常严格,所有单元测试都必须在同一个项目中。仍然所有单元测试都必须在构建中运行。我需要的是确保批处理单元测试不在与其他单元测试相同的过程中运行。有没有办法做到这一点?
编辑: 具体来说,我正在寻找一种方法来控制每个测试运行的进程。我找不到关于此的文档,但似乎所有单元测试都在QTAgent32.exe进程的同一个实例下运行。有一个设置可以确定测试是否在同一个过程中运行(工具>选项>测试工具>测试执行>让测试离子引擎在测试之间运行)。但是,这是一个全球性的环境。我需要说的是“在这个过程中运行这些测试,并在这个过程中运行这些测试”。有没有办法做到这一点?
答案 0 :(得分:2)
这就是全局状态的问题,正如您所提到的:在一次测试中修改它会影响其他测试。
这告诉我你更多地使用自动化测试作为集成测试。您仍然可以为所有“集成”样式测试创建另一个项目并将它们放在一起(知道它们可能会相互影响并且很脆弱)并且您可以将两个测试项目都插入到构建/ CI系统中。
解决此问题的另一种方法是使用模拟对象并以“单元测试”样式进行写入测试,没有其他依赖性而不是被测试类。根据您所写的内容,这可能包括难以做到,不可能或适用于次要重构。
答案 1 :(得分:1)
良好的单元测试的一个关键要求是它是孤立的。在实践中,这意味着没有单元测试使用来自其他测试的状态,或者在其他测试中可能受到状态的影响。
单元测试必须在执行前设置所需的状态,然后将其拆除。例如,这可以通过使用测试夹具来完成。与此相关的是Arrange-Act-Assert(AAA),它是用于编写单元测试的模式。
在你的情况下静态数据不好,这使得难以测试!
如何重构代码以便静态数据可以通过某种界面或通过工厂获得?
不知道你的问题区域是不可能给出一个最好的答案。但是,您应该采用的方法是取出共享的静态数据,因此每个测试都可以设置自己的数据集。现在每个测试都可以隔离,并且只处理“自己的”数据。
这提供了进一步的好处,例如:1)单元测试只有足够的数据集来测试一件事2)系统中的依赖性较小,以及3)可能更快/更小的测试。
最后,我同意Hadi的意见,你应该将单元测试和集成/功能测试分开。这非常重要,因为他们以不同的方式测试。
祝你好运!