集成测试包含什么以及如何设置它们

What are integration tests containing and how to set them up

我目前正在学习单元测试和集成测试,据我了解,单元测试用于测试特定class的逻辑,集成测试用于检查多个classES 和库。

但它是否仅用于测试多个 classes 以及它们是否按预期一起工作,或者在集成测试中访问数据库是否也有效?如果是这样,如果由于服务器端错误而无法建立连接怎么办,测试不会失败,尽管代码本身会按预期工作?我怎么知道在这种测试中使用什么是有效的?

我不明白的第二件事是它们是如何设置的。单元测试在我看来有一种很常见的形式,比如:

public class  classTest {

    @BeforeEach
    public void setUp(){
    }

    @Test
    public void testCase(){
    }
}

但是集成测试是怎么写的呢?它通常以相同的方式完成,只是包括更多 classes 和外部因素,还是有其他方法用于此?

作为集成测试的一部分访问数据库是有效的,因为集成测试应该显示功能是否正常工作。

如果某项功能由于与服务器端错误的连接失败而无法使用,您会希望测试失败以通知您此功能无法使用。集成测试不会告诉您故障出在哪里,只是某个功能无法正常工作。

请参阅 ,因为这有助于阐明广泛接受的差异。

在集成测试中使用数据库(或您正在使用的服务的外部连接)不仅有效,而且应该这样做。但是,不要过度依赖集成测试。对您拥有的每个逻辑元素进行单元测试,并为特定流程设置集成测试。

集成测试可以用相同的方式编写,除了(如您所提到的)它们包含更多方法等。事实上,您在上面显示的代码片段是集成的常见开始 write-up测试。

您可以在此处阅读有关测试的更多信息:https://softwareengineering.stackexchange.com/questions/301479/are-database-integration-tests-bad

[... ] is it also valid to access databases in an integration test? [...] How do I know what‘s valid to use in this kind of tests?

unit-tests 和集成测试之间的区别不在于是否涉及多个组件:即使在 unit-testing 中,如果这些依赖项不存在,您也可以在不模拟所有依赖项的情况下相处阻碍您实现 unit-testing 目标(参见 )。

区分unit-testing和集成测试的是测试的目标。正如您所写,在 unit-testing 中,您的重点是查找函数、方法或 class 的逻辑中的错误。显然,在集成测试中,目标是检测在 unit-testing 期间找不到但可以在集成(子)系统中找到的错误。始终牢记测试目标有助于创建更好的测试并避免集成测试和 unit-tests.

之间不必要的冗余

集成测试的一种形式是交互测试:在这里,目标是发现两个或多个组件之间的交互中的错误。 (可以模拟或不模拟其他组件——同样,这取决于其他组件是否会阻止您达到测试目标。)两个组件 AB 交互中的典型问题可能是,对于例如,如果 B 是一个库:组件 A 是否调用组件 B 的正确函数,组件 B 是否处于适当的状态以供 A 访问通过该函数(B 可能尚未初始化),A 是否以正确的顺序传递参数,参数是否包含预期形式的值,B 是否返回以预期的方式和预期的格式产生结果?

集成测试的另一种形式是子系统测试,您不关注组件之间的交互,而是查看由集成组件形成的子系统的边界。而且,同样,目标是找到以前的测试(即 unit-tests 和交互测试)无法找到的错误。例如,组件是否集成在正确的版本中,所需的 use-cases 是否可以在集成子系统上运行等

虽然 unit-tests 构成 test pyramid 的底部,但集成测试是一个适用于不同集成级别的概念,甚至可以专注于与软件集成策略正交的接口(例如,当做一个驱动和它对应的硬件设备的交互测试)。

Second thing I don‘t understand is how they are set up. [...] how are integration tests written?

这里有一个极端的变化。对于许多集成测试,您可以只使用用于 unit-tests 的相同测试框架:这些框架中没有任何特定的 unit-test。当然,在测试用例中,您必须确保设置实际上将感兴趣的组件组合在其正确的版本中。并且,需要决定是否仅使用或模拟额外的依赖项(见上文)。

另一个典型场景是在完全集成的系统中执行集成测试,使用 system-test-like 设置。这样做通常是出于方便,只是为了避免为不同的集成测试创建不同的特殊设置的麻烦:完全集成的系统只是将它们全部组合在一起。当然,这也有缺点,因为以这种方式按需要执行所有集成测试通常是不可能的,或者至少是不切实际的。而且,当以这种方式进行集成测试时,集成测试和系统测试之间的界限变得模糊。在这种情况下保持专注意味着您确实必须对不同的测试目标有很好的理解。

也有混合形式的,这里就不多说了。仅举一个例子,可以在 LD_PRELOAD (What is the LD_PRELOAD trick?).

的帮助下模拟一些共享库