pro*_*ski 16 testing client integration-testing client-server mocking
我正在使用两个应用程序进行项目:android app(客户端)和rest服务(server).我的Android应用程序消耗我的休息服务.
这两个应用程序都是单独测试的,以确保它们按预期开展业务.在服务器测试期间,我准备请求并检查服务器响应 在客户端测试期间,我设置了一个简单的http模拟服务器,并针对不同的模拟响应测试客户端的请求.
现在,这种技术非常有效.它给了我一种我喜欢的灵活性.我可以使用不同的测试框架和持续集成环境.但有一个弱点.在(客户端和服务器)测试用例中,我指定了相同的api.我假设,例如
GET /foo-list.json
Run Code Online (Sandbox Code Playgroud)
将使用json返回HTTP 200
[{
id: 1,
name: foo1,
}, {
id: 2,
name: foo2
}]
Run Code Online (Sandbox Code Playgroud)
所以我重复一遍.如果我更改响应格式,我的客户端测试不会失败.
我的问题是关于测试这种情况的良好做法.如何在不牺牲独立测试灵活性的情况下进行真正的集成测试.我应该使用模拟服务器或我的休息服务的真实实例来测试客户端吗?
请分享您的专业经验.
在您的场景中,您应该继续编写单元测试来测试单个类,并使用集成测试来测试多个应用程序层(例如业务层和数据库层)之间的互操作.
你问:
"如何在不牺牲独立测试灵活性的情况下进行真正的集成测试"
您的所有代码都应该使用抽象,这样您就可以使用依赖注入来使用模拟依赖项完全隔离单元测试类.使用模拟将确保这些测试保持独立,即不与任何其他类耦合.因此,采用这种方法,使用最终具体类的集成测试不会影响使用模拟类的单元测试.
也:
"我应该使用模拟服务器或我的休息服务的真实实例来测试客户端吗?"
除了单元和集成测试之外,您还应该执行客户端 - 服务器集成测试 ; 我使用自动验收测试来做到这一点.使用诸如Cucumber之类的测试框架(也查看专门用于测试移动应用程序的calaba.sh),您可以编写测试,测试将与客户端(您的Android应用程序)和服务器(您的客户端)交互的特定功能和方案RESTful服务).这些客户端 - 服务器集成测试将启动并停止客户端和服务器的具体实例.
模拟用于单元测试。您对模拟测试的描述准确地描述了这一点。您将客户端和服务器作为单独的单元进行测试。
集成测试测试这些单元是否可以很好地协同工作。由于该接口是 REST 接口,因此模拟没有任何意义,您必须通过 HTTP 测试真实的东西。
另请参阅集成测试和单元测试有什么区别?