我目前正在编写Java客户端服务器应用程序。所以我想实现两个库,一个用于客户端,一个用于服务器。客户端服务器通信有一个非常严格的协议,我不想用JUnit进行测试。
作为构建工具我使用Maven和Husdon Server进行持续集成。
实际上我没有任何好主意如何测试这些客户端/服务器库。
我得到了以下方法:
只需编写一个虚拟客户端来测试服务器并编写虚拟服务器来测试客户端。 缺点:不幸的是,这将导致许多额外的工作。我无法100%确定客户端和服务器可以一起工作,因为我不确定测试完全相同。
编写一个单独的测试项目,将客户端和服务器一起测试 缺点:单元测试不属于自己的项目,因此Hudson不会自动运行它们。在其中一个库中更改任何内容的每个人都必须手动运行测试以确保一切正确。此外,我不会收到任何代码覆盖率报告。
有没有更好的方法来测试这样的代码? 也许测试一个Maven多模块项目,或类似的东西。
我希望任何人都能找到一个很好的解决方案。
感谢。
答案 0 :(得分:9)
将您的所有代码视为“将输入转换为输出”:X -> [A] -> Y
X
是进入的数据,[A]
是变换器,Y
是输出。在您的情况下,您有这个设置:
[Client] -> X -> [Server] -> Y -> [Client]
所以单元测试工作如下:
您需要运行客户端代码的测试才能生成X
。验证代码是否实际生成带有断言的X
。 X
应该是代码中的final static String
。
在第二个测试中使用常量X
来调用服务器代码,将其转换为Y
(另一个常量)。
第三个测试确保客户端代码可以解析输入Y
这样,您可以保持测试独立,并且仍然确保重要部分工作:组件之间的接口。
答案 1 :(得分:1)
我的建议是使用两个级别的测试:
对于您的客户端/服务器项目,请在单元测试中包含一些模拟,以确保对象接口按预期工作。
在构建之后,进行更广泛的集成测试运行,并自动在一个或多个测试系统上安装已编译的客户端和服务器。然后,您可以确保彻底测试协议的所有细节。在每次成功构建客户端/服务器项目时触发此集成测试项目。你可以使用JUnit,但仍然可以收到Hudson的传统报告。
答案 2 :(得分:1)
所以最后解决方案是构建一个多模块项目,其中包含一个单独的测试模块,其中包括服务器和客户端模块 在Husdon工作得很好。在Eclipse IDE中甚至更好。 谢谢@Aaron提示
答案 3 :(得分:1)
解决此问题的最新方法是使用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
答案 4 :(得分:0)
您可以使用任何模拟对象框架来创建模拟对象 - 尝试使用jmockit。