首页 文章

客户端 - 服务器集成测试:是否嘲笑?

提问于
浏览
14

I'm working on project with two applications: android app (client) and rest service (server) . 我的Android应用程序消耗我的休息服务 .

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

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

GET /foo-list.json

将使用json返回HTTP 200

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

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

我的问题是关于测试这种情况的良好做法 . 如何在不牺牲独立测试灵活性的情况下进行真正的集成测试 . Should I test client with mocked server or with a real instance of my rest service?

请分享您的专业经验 .

4 回答

  • 1

    如果您的服务基于Java,我强烈建议您查看Spock框架,以模拟可能来自客户端的任何类型的调用 . 由于Spock只是jUnit的扩展,你也可以将它用于Android(不过,公平地说,我从未做过Android开发)

    我想你要做两件事 . 集成测试和单元测试 . 集成测试将尝试启动Android应用程序并使其进行服务调用,确保上下文彼此友好地交互 .

    但是,在你的常规提交中,我建议进行单元测试,除了被测试的类之外,它还会抄掉一切 . Spock使这很容易做到,因为它 Build 在jUnit之上所有它需要一个jar .

  • 1

    您无法使用真实服务实例运行自动端到端测试 . 您可以在用于运行单元测试的同一测试计算机上运行实际服务实例,可能在同一容器中 . 您可以设置配置以使用服务器实例的不同URL来运行自动端到端测试 .

    如果您可以针对真实服务运行模拟服务,为什么还要进行创建模拟服务的额外工作?

    我只会创建一个模拟服务,如果该服务是我无法控制的外部服务!

  • 4

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

    你问:

    “如何在不牺牲独立测试灵活性的情况下进行真正的集成测试”

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

    也:

    “我应该使用模拟服务器或我的休息服务的真实实例来测试客户端吗?”

    除了单元和集成测试之外,您还应该执行客户端 - 服务器集成测试;我使用自动验收测试来做到这一点 . 使用Cucumber等测试框架(也可以查看calaba.sh专门用于测试移动应用程序),您可以编写测试,测试与客户端(您的Android应用程序)和服务器(您的RESTful服务)交互的特定功能和方案) . 这些客户端 - 服务器集成测试将启动并停止客户端和服务器的具体实例 .

  • 8

    模拟用于单元测试 . 您对模拟测试的描述正是如此 . 您将客户端和服务器作为单独的单元进行测试

    集成测试测试单元是否一起工作 . 由于接口是REST接口,因此模拟没有意义,您必须通过HTTP测试真实的东西 .

    另见What is the difference between integration and unit tests?

相关问题