如何unit testing客户端服务器代码

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

作为构建工具我使用Maven和Husdon Server进行持续集成。

实际上我没有任何好主意如何测试这些客户端/服务器库。

我有以下方法:

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

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

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

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

谢谢。

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

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

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

所以unit testing工作如下:

  1. 您需要一个运行客户端代码的测试来生成X validation代码实际上是否生成带有断言的X X应该是代码中的final static String

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

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

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

最后,解决方案是构建一个多模块项目,其中包含一个单独的测试模块,其中包括服务器和客户端模块,在Husdon中非常出色。 在Eclipse IDE中甚至更好。 谢谢@Aaron的暗示

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

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

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

解决此问题的最新方法是使用Docker容器。 创建一个docker文件,其中包含基本映像以及客户端服务器应用程序所需的所有必需依赖项。 为分布式客户端 – 服务器系统的每个节点类型创建一个单独的容器,并使用TestNG或JUnit测试所有入口点服务器API /客户端交互。 这种方法最好的部分是你不会嘲笑任何服务电话。 在大多数情况下,您可以协调所有端到端客户端 – 服务器交互。

这种方法涉及一些学习曲线,但Docker在Dev社区中变得非常受欢迎,特别是为了解决这个问题。

下面是一个如何使用docker client api在JUnit测试中提取docker镜像的示例: https : //github.com/influxdb/influxdb-java/blob/master/src/test/java/org/influxdb/InfluxDBTest的.java

您可以使用任何模拟对象框架来创建模拟对象 – 尝试jmockit。