我有我的单元测试。每种测试方法都在我的系统中测试逻辑单元的功能。在我的单元测试中,使用Mocks和Fakes来处理外部依赖项(db,file等)。
现在我不确定我应该如何进行集成测试。我应该重复单元测试,然后用实际资源(数据库,文件等)替换,或者我应该测试更低级别的内容,例如:
1)可以ping数据库
2)可以检索一个记录
3)文件是否存在
等...
我的直觉是,我应该在这个阶段避免商业逻辑,因为大多数应该在单位完成,对吗?
由于
编辑:我在编写我的问题时有点懒,我还想知道的是,如果我需要在集成阶段测试业务逻辑,那么我应该如何设置我的测试套件以最大限度地减少测试代码的重复。举个例子:[TestMethod] //Unit Tests
public void CanGetData()
{
IRepository rep = new MockRepository();
var result = rep.GetData();
Assert.IsTrue(result != null)
}
[TestMethod] //Integration Test
public void CanGetData()
{
IRepository rep = new Repository(); //real repository
var result = rep.GetData();
Assert.IsTrue(result != null)
}
什么测试结构适合您?您是否直接在集成项目中使用Unit测试程序集并注入正确的资源?
答案 0 :(得分:4)
集成测试应不避免任何业务逻辑。集成测试的重点是验证应用程序域的不同部分的行为是否一致地协同工作。 包含您的业务逻辑。
单元测试验证在特定条件下单个工作单元是否正常运行。但是,这并不能保证所说的“工作单元”能够与系统中的其他“工作单元”正常运行。这是集成测试在您的测试套件中发挥关键作用的地方。
系统的实际资源(数据库,文件等)应该在某个时候引入测试套件,但单元测试中不。大多数人发现集成测试是包含资源的合适位置。请注意,将环境资源包含在测试套件中可能是一项任务。此外,它肯定会减慢您的集成测试。
我还会将我的单元测试和我的集成测试分开。我更喜欢单独的组件。通过这种方式,我可以通过我的测试人员单独运行每个套件并获得每个套件这里的原因同样是因为您的集成测试通常需要比单元测试运行更长的时间。
答案 1 :(得分:3)
好吧,不要羞怯,但在集成测试中,您应该测试集成。您需要更广泛的测试来演示组件协同工作而不是测试单个单元。在某些时候,您通常还希望演示您的系统使用真实资源而不是模拟。
所以,是的,通常你应该用真实的数据库等进行测试。你也应该测试业务逻辑,即使它已经过单元测试。您基本上应该最终运行场景,从头到尾测试每个用户可访问的功能,并确认结果(包括数据库的内容)是否符合预期。
答案 2 :(得分:2)
YMMV极大地定义了这里。恕我直言,“单元测试”一词受到语言漂移的影响。 (有关详细信息,请参阅我的blog post)。
听起来您对单元测试的内容有很好的理解。在这种情况下,通过解释它不是什么来定义什么是更容易的。集成测试实际上是一种自动化测试,不是单元测试(提供您的定义)。我相信集成测试是一个互斥的类别,它包含我们用于自动化测试的所有其他技术,其中系统中的组件实际上彼此通信。这意味着,正如您所说,测试的上下文中存在任何外部依赖项。
其他人可能会或可能不会同意,但重要的一点是,给定测试的可维护性随着测试环境的大小增加而增加。上下文越大,测试的速度越慢且维护性越差。
因此,您真的想要考虑在这个级别上您将从测试中获得什么。您确实需要持续集成来维护集成测试,如果需要很长时间才能运行,可能需要安排它们按间隔运行。通常,他们在故障发生时会更难以诊断故障(因为它们更复杂),并且如果要在测试套件中连续运行,您将确保测试提供明确的业务价值。另一种说法是,糟糕的测试比没有测试更糟糕。这就是为什么单元测试对于您作为开发人员来说至关重要的原因。在高于隔离单元/组件的水平上进行测试可以降低成本。
命名和记录在这里可以提供很多帮助,但要小心。编写直接针对需求/功能或回归/错误的集成测试。如果这是一个“冒烟测试”测试你最关心的事情,或者最突破的事情。你需要务实。
希望这有帮助。
答案 3 :(得分:1)
单元测试检查单个组件是否有效。 “组件”,如“你可以构建的最小的东西,哪些东西”。这些验证了组件的内部工作。
集成测试验证组件之间的接口。示例:我的班级可以将数据写入真实数据库吗?它是否正确处理数据库中的错误?当我将这些数据放入数据库时,我会在webapp中看到它吗?
通常,两者之间的界限有点流畅。你将把“can class X persist in”放在一个单元测试中(尽管这实际上是一个集成测试)。
大多数项目通过努力分离测试:如果大多数开发人员可以在没有设置的情况下运行它们,他们会说“单元测试”。如果你需要准备好几台计算机(加载数据,启动程序,确保它是正确的版本),那就是我所说的“集成测试”。
请注意,这两项测试都可以(并且应该)自动化。
答案 4 :(得分:0)
要回答您编辑过的问题,(您可能希望将其重新整理或分解为单独的问题......)您肯定想分开关注,并且< em>肯定想使用依赖注入。隔离依赖关系并使用配置注入它们;这允许您交换配置中的对象而不是代码。这样就可以完全保持对象的初始化。 (您还可以使用配置用于登台和生产环境......)
我通常使用Spring来实现此目的,但任何DI / IoC容器都将为您提供此功能。这是最可配置的方法,如果您已经在进行依赖注入,则效果很好。它也与保持两个套房分开的想法很吻合。