2010-10-14 83 views
23

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

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

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

我有以下方法:

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

  2. 编写一个测试项目,一起测试客户端和服务器。
    缺点:单元测试不属于自己的项目,所以哈德森不会自动运行它们。每个在这些库之一改变任何东西的人都必须手动运行测试以确保一切正确。我也不会收到任何代码覆盖率报告。

有没有更好的方法来测试这样的代码? 也许测试一个Maven Multi Module Project或类似的东西。

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

谢谢。

回答

2

所以最后的决议是建立一个多模块项目,与包括服务器和 在Husdon伟大工程的客户端模块的独立测试模块。在Eclipse IDE中甚至更好。 谢谢@亚伦提示

8

思考的所有代码为“变换输入到输出”:X -> [A] -> Y

X是云中的数据,[A]是变压器,Y是输出。你的情况,你有这样的设置:

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

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

  1. 你需要运行的客户端代码生成X测试。验证代码实际上是否生成了带有断言的X。代码中的X应该是final static String

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

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

这样,您就可以保持测试的独立,仍然确保重要零部件的工作:界面之间组件。

+1

嗯,这接缝是完全以实现对服务器和客户端的独立单元测试的方式。事实上,这将导致将常量复制粘贴到两个项目中,并因此实现“虚拟客户端”/“虚拟服务器”。这是我上面列出的第一种方法。 – StaticBR 2010-10-14 08:31:39

+0

为什么你把客户端和服务器放到不同的项目中? *困惑*无论如何,如果你真的想这样做,那么创建第三个单元测试项目,导入其他两个项目,所以你只需要一次常量。 – 2010-10-14 08:55:35

+2

嗯,两个项目,因为客户端必须去低资源设备。测试项目是我已经列出的第二种方法。我还写了这种方法的缺点。 – StaticBR 2010-10-14 09:04:07

0

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

1

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

  1. 为您的客户端/服务器项目,包括一些嘲弄在单元测试中,以确保对象的接口按预期工作。

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

1

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

这种方法有一点点学习曲线,但是Docker在Dev社区变得非常受欢迎,尤其是为了解决这个问题。

这里是你如何可以使用泊坞窗客户端API将泊坞窗图像JUnit测试的例子: https://github.com/influxdb/influxdb-java/blob/master/src/test/java/org/influxdb/InfluxDBTest.java

相关问题