这个问题或多或少与编程语言无关。但是,由于这些天我主要使用 Java,因此我将从中提取示例。我也在考虑 OOP 案例,所以如果你想测试一个方法,你需要一个该方法类的实例。
单元测试的核心规则是它们应该是自治的,这可以通过将一个类与其依赖项隔离来实现。有几种方法可以做到这一点,这取决于您是否使用IoC注入依赖项(在 Java 世界中,我们有 Spring、EJB3 和其他提供注入功能的框架/平台)和/或您是否模拟对象(对于 Java,您有JMock和EasyMock)将被测试的类与其依赖项分开。
如果我们需要测试不同类*中的方法组并看到它们很好地集成,我们编写集成测试。这是我的问题!
- 至少在 Web 应用程序中,状态通常被持久化到数据库中。我们可以使用与单元测试相同的工具来实现与数据库的独立性。但是以我的拙见,我认为在某些情况下,不使用数据库进行集成测试是在嘲笑太多(但可以不同意;根本不使用数据库也是一个有效的答案,因为它使问题变得无关紧要)。
- 当您使用数据库进行集成测试时,如何用数据填充该数据库?我可以看到两种方法:
- 存储集成测试的数据库内容并在开始测试之前加载它。如果它被存储为 SQL 转储、数据库文件、XML 或其他东西会很有趣。
- 通过 API 调用创建必要的数据库结构。这些调用可能会在您的测试代码中拆分为几个方法,并且这些方法中的每一个都可能失败。它可以被视为您的集成测试依赖于其他测试。
您如何确定测试所需的数据库数据在您需要时是否存在?你为什么选择你选择的方法?
请提供带有动机的答案,因为有趣的部分在于动机。请记住,只是说“这是最佳实践!” 不是真正的动机,它只是重复你读过或从某人那里听到的东西。对于这种情况,请解释为什么它是最佳实践。
*在我的单元测试定义中,我在同一类的(相同或其他)实例中包含了一种调用其他方法的方法,即使它在技术上可能不正确。随时纠正我,但让我们把它作为一个附带问题。