如何对客户端服务器代码进行单元测试

2022-09-01 14:41:22

我目前正在编写一个 Java 客户端服务器应用程序。所以我想实现两个库,一个用于客户端,一个用于服务器。客户端服务器通信有一个非常严格的协议,我不想用JUnit进行测试。

作为构建工具 im 使用 Maven 和 Husdon 服务器继续集成。

实际上,我没有任何好的想法如何测试这些客户端/服务器库。

我有以下方法:

  1. 只需编写一个虚拟客户端来测试服务器,并编写一个虚拟服务器来测试客户端。弊:不幸的是,这将导致许多额外的工作。我无法100%确定客户端和服务器可以一起工作,因为我不确定测试是否完全相同。

  2. 编写一个单独的测试项目,一起测试客户端和服务器。
    缺点:单元测试不属于项目本身,因此Hudson不会自动运行它们。每个在其中一个库中更改任何内容的人都必须手动运行测试,以确保一切都是正确的。另外,我不会收到任何代码覆盖率报告。

有没有更好的方法来测试这样的代码?也许测试一个Maven多模块项目,或类似的东西。

我希望任何人都能为这个问题找到一个好的解决方案。

谢谢。


答案 1

将所有代码视为“将输入转换为输出”:X -> [A] -> Y

X是进入的数据,是转换器,是输出。在您的情况下,您有这样的设置:[A]Y

[Client] -> X -> [Server] -> Y -> [Client]

所以单元测试的工作原理是这样的:

  1. 您需要一个运行客户端代码以生成 的测试。验证代码是否确实使用断言生成。 应该是代码中的 a。XXXfinal static String

  2. 在第二个测试中使用该常量来调用服务器代码,该代码将其转换为(另一个常量)。XY

  3. 第三个测试确保客户端代码可以解析输入Y

这样,您可以保持测试的独立性,同时仍确保重要部分正常工作:组件之间的接口。


答案 2

我的建议是使用两个级别的测试:

  1. 对于客户端/服务器项目,在单元测试中包含一些模拟,以确保对象接口按预期工作。

  2. 在构建之后,进行更广泛的集成测试运行,并自动将编译好的客户端和服务器安装在一个或多个测试系统上。然后,您可以确保对协议的所有细节进行彻底测试。在每次成功构建客户端/服务器项目时触发此集成测试项目。您可以使用 JUnit 来实现此目的,并且仍然可以从 Hudson 接收常规报告。