首页 > 解决方案 > 如何自动化连接(和修改)到外部服务器的测试

问题描述

我目前正在编写一个 Java 程序,它是另一个服务器的接口。大多数功能(接近 >90%)在服务器上执行某些操作。目前,我只是在编写简单的类,在服务器上运行一些操作,然后自己检查它,或者向测试添加方法来读取写入的信息。

目前,我正在自己的计算机上开发,并且有一个版本的服务器在 VM 上本地运行。

我不想在每次构建时都继续运行测试,因为我也不想继续修改我连接的服务器。我不确定进行测试的最佳方法。我有运行每个构建的 JUnit 测试(在不与外部交互的简单函数上)。我似乎看不到 JUnit 中编写不必在每次构建时都运行的测试的固定方式(也许当它们的功能发生变化时?)。

或者,谁能指出我如何最好地处理我的测试的正确方向。

谢谢!

标签: javatestingjunit

解决方案


我不想在每次构建时都继续运行测试,因为我不想继续修改我连接到的服务器

这应该已经为您敲响了警钟。运行测试会给你反馈你是否破坏了东西。不运行它们意味着你是盲人。这并不意味着一切都很好。

有几种方法,具体取决于您对服务器代码的访问权限。

完全访问

如果您自己编写服务器,或者您可以访问代码,那么您可以为服务器创建一个测试套件 - 完全在内存中运行并允许您控制服务器如何响应的服务器的修改版本,因此您可以模拟不同的场景。

这种测试套件是通过将服务器的逻辑部分与其周围环境分离,然后模拟它们或创建它们的内存版本(如数据库、队列、文件系统等)来创建的。这允许服务器非常快速地运行,然后可以在测试本身内创建和销毁它。

有限/禁止访问

如果您必须编写与您无法控制的服务器集成的测试,例如 3rd 方 API,那么方法是编写远程服务的“模拟”,并进行合同测试以检查模拟是否仍然有效和实物一样。我通常将它们放在不同的构建中,偶尔运行它只是为了知道我的模拟服务器没有偏离真实服务器。

一旦你有了你的模拟服务器,你就可以为它编写一个适配器层,由集成测试覆盖。您的其余代码将仅使用适配器,因此可以使用普通单元测试进行测试。


当然,当您拥有完全访问权限时,也可以使用第二种方法,但通常编写测试套件会更好,因为这些类型的测试往往会在项目和团队之间重复,然后当服务器更改整体时一群人需要修复他们的测试,而如果测试套件是作为服务器代码的一部分编写的,则只需在一个地方进行更改。


推荐阅读