Java 集成测试包含哪些内容以及如何设置它们

Java 集成测试包含哪些内容以及如何设置它们,java,unit-testing,testing,integration-testing,Java,Unit Testing,Testing,Integration Testing,我目前正在学习单元测试和集成测试,据我所知,单元测试用于测试特定类的逻辑,集成测试用于检查多个类和库的协作 但是,它是否仅用于测试多个类,以及它们是否按预期协同工作,或者在集成测试中访问数据库也是有效的?如果是这样的话,如果由于服务器端错误而无法建立连接,尽管代码本身可以按预期工作,但测试不会失败吗?我如何知道在这种测试中什么是有效的 我不明白的第二件事是它们是如何设置的。在我看来,单元测试有一种非常常见的形式,比如: public class classTest { @Before

我目前正在学习单元测试和集成测试,据我所知,单元测试用于测试特定类的逻辑,集成测试用于检查多个类和库的协作

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

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

public class  classTest {

    @BeforeEach
    public void setUp(){
    }

    @Test
    public void testCase(){
    }
}

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

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

如果由于与服务器端错误的连接失败而导致某个功能无法工作,则您可能希望测试无法通知您该功能无法工作。集成测试并不是为了告诉您故障在哪里,只是告诉您某个功能不起作用


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

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

集成测试可以用同样的方式编写,除非您提到它们包含更多的方法等。事实上,您上面展示的代码片段是集成测试的常见开始编写

您可以在此处阅读有关测试的更多信息:

[…]在集成测试中访问数据库也有效吗?[…]我如何知道在这种测试中使用什么是有效的

单元测试和集成测试之间的区别并不在于是否涉及多个组件:即使在单元测试中,如果这些依赖关系不妨碍您实现单元测试目标,您也可以在不模仿所有依赖关系的情况下相处,请参见

单元测试和集成测试的区别在于测试的目标。正如您所写的,在单元测试中,您的重点是在函数、方法或类的逻辑中查找bug。显然,在集成测试中,目标是检测单元测试期间无法发现但在集成子系统中可以发现的bug。始终牢记测试目标有助于创建更好的测试,并避免集成测试和单元测试之间不必要的冗余

集成测试的一种风格是交互测试:这里的目标是在两个或多个组件之间的交互中发现bug。附加组件可以被模拟,也可以不被模拟——这同样取决于附加组件是否阻碍您达到测试目标。两个组件A和B的交互中的典型问题可能是,例如,如果B是一个库:组件A是否调用组件B的正确函数,组件B是否处于可由A通过该函数访问的正确状态,功能B可能尚未初始化,A是否以正确的顺序传递参数,参数是否包含预期形式的值,B是否以预期方式和预期格式返回结果

集成测试的另一种风格是子系统测试,您不关注组件之间的交互,而是关注由集成组件形成的子系统的边界。同样,目标是找到以前的测试(即单元测试和交互测试)无法找到的bug。例如,组件是否集成在正确的版本中,所需用例是否可以在集成子系统上执行等

虽然单元测试构成了底层,但集成测试是一个应用于不同集成级别的概念,甚至可以关注与软件集成策略正交的接口,例如,在对驱动程序及其相应硬件设备进行交互测试时

我不明白的第二件事是它们是如何设置的。[…]集成测试是如何编写的

这里有一个极端的变化。对于许多集成测试,您可以使用与单元测试相同的测试框架:这些框架中没有特定于单元测试的内容。当然,在测试用例中,您必须确保设置实际上将感兴趣的组件组合到它们的正确版本中。而且,是否只是使用或模拟额外的依赖关系需要确定参见abo ve

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


也有混合形式,但这里有太多无法描述的形式。仅举一个例子,在LD_PRELOAD的帮助下,可以模拟一些共享库。

那么,是否也可以进行集成测试,只检查与数据库的连接是否正确建立,或者这不是需要测试的内容?谢谢您的详细回答!这无疑有助于更好地理解它。但我仍然在为实现和如何设置它而挣扎。如果我有客户机和服务器代码,并且我想测试注册代码,我会通过将测试用户插入数据库来测试它吗?或者我模拟一个数据库,只检查客户机是否将数据通过它的类正确地传递到数据库?我认为我缺乏想象力,无法想象这是如何工作的。所有这一切都是可能的,但哪种情况最好取决于您试图找到的bug。例如,模拟数据库是有意义的,除非您还希望在代码与数据库对话的方式中发现可能的错误,例如SQL命令中的错误。如果你想讨论这个问题,我已经邀请你去聊天室了。好吧,这绝对是有道理的。谢谢你,我确实对这个话题和它的用法有疑问,所以我一定会回到那个话题上来!