testing - 客户端-服务器集成测试 : mock or not?

标签 testing mocking client-server client integration-testing

我正在处理两个应用程序的项目:android 应用程序(客户端)和 rest 服务(服务器)。我的 Android 应用使用了我的休息服务。

这两个应用程序都经过单独测试,以确保它们按预期开展业务。 在服务器测试期间,我准备请求并检查服务器响应。 在客户端测试期间,我设置了一个简单的 http 模拟服务器,并根据不同的模拟响应测试客户端的请求。

现在,这项技术非常有效。它给了我我喜欢的灵 active 。我可以使用不同的测试框架和持续集成环境。但是有一个弱点。在(客户端和服务器)测试用例中,我指定了相同的 api。我假设例如

GET /foo-list.json

将返回带有 json 的 HTTP 200

[{
    id: 1,
    name: foo1,
}, {
    id: 2,
    name: foo2
}]

所以我重复一遍。如果我更改响应格式,我的客户端测试将不会失败。

我的问题是关于测试这种情况的良好做法。如何在不牺牲独立测试灵 active 的情况下进行真正的集成测试。 我应该使用模拟服务器还是使用我的 rest 服务的真实实例来测试客户端?

请分享您的专业经验。

最佳答案

在您的场景中,您应该继续编写单元测试来测试各个类,并编写集成测试来测试多个应用层(例如业务层和数据库层)之间的互操作。

你问:

"How to make true integration tests without sacrificing flexibility of independent tests"

你的所有代码都应该使用抽象,这样你就可以使用依赖注入(inject)来使用模拟依赖完全隔离地对类进行单元测试。模拟的使用将确保这些测试将保持独立,即不耦合到任何其他类。因此,采用这种方法,将使用最终具体类的集成测试不会影响使用模拟类的单元测试。

还有:

"Should I test client with mocked server or with a real instance of my rest service?"

除了单元和集成测试之外,您还应该执行客户端-服务器集成测试;我使用自动验收测试来执行此操作。使用诸如 Cucumber 之类的测试框架(另请查看 calabash-android ,它是专门为测试移动应用程序而编写的)您可以编写测试来测试与客户端(您的 Android 应用程序)和服务器交互的特定功能和场景(您的 RESTful 服务)。这些客户端-服务器集成测试将启动和停止客户端和服务器的具体实例。

关于testing - 客户端-服务器集成测试 : mock or not?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19392508/

相关文章:

python - 有没有办法让 python pickle 忽略 "it' s not the same object“错误

testing - 运行 NUnit 时访问 app.settings

ios - 单元测试未编译 - Swift Xcode 9.2

asp.net-mvc - 如何在 ASP.NET MVC 中测试操作过滤器?

node.js - 使用mockery模拟fs模块

c++ - char 数组到字符串的转换会导致奇怪的字符 - 套接字

python - Pytest 卡在 'collecting...' 上

java - 容器内测试与用于集成测试的模拟对象

java - java中如何获取客户端socket程序中的客户端端口和IP地址

c# - 客户端和服务器之间的通信层