正确的方法来测试REST API(php)

时间:2017-07-29 02:36:22

标签: php rest phpunit swagger behat

从来没有想过测试一个REST API会那么困难,当我在做fullstack时,我梦想着去REST,所以我没有弄乱html和所有那些东西,只有Behat拯救我,它有助于很多时候来测试html页面。

但是当谈到测试API时我很头疼。假设我有一些资源,比如用户对话列表。

{
  "_links": {
    "self": {
      "href": "/api/v1/conversations"
    }
  },
  "_embedded": {
    "items": [
      {
        "id": 4,
        "name": "Lana Smith",
        "avatarUrl": "/static/avatars/597bd819d90f2568107586.png",
        "createdAt": "2017-01-05T00:00:00+03:00",
        "updatedAt": "2017-01-05T00:00:00+03:00",
        "_links": {
          "self": {
            "href": "/api/v1/conversations/4"
          }
        }
      },
      {
        "id": 3,
        "name": "Ian North [Support Agent]",
        "avatarUrl": "/static/avatars/default.png",
        "createdAt": "2017-01-04T01:00:00+03:00",
        "updatedAt": "2017-01-04T01:02:00+03:00",
        "_links": {
          "self": {
            "href": "/api/v1/conversations/3"
          }
        }
      },
    ]
  }
}

作为一个体面的人,我有Swagger文档,它声明这个特定的资源应该是这样的,那些字段是可选的,那些是整数类型,你有关系等等等等

可是:

  • 我如何测试结构IS,因为swagger docs说它是
  • 我该怎么做 测试数据是否正确(就像那个用户确切的那样) 对话,而不是其他人,以及正确的数量)

我的想法很少:

  • 只测试测试中硬编码的JSON的整个有效负载与来自响应的一个。这里的困难有时候我不知道在夹具加载过程中生成的例子createdAt / updatedAt的确切值,avatar url总是随机的,除非默认等等。
  • 使用phpunit并手动测试所有内容,例如:assertPropertyCount($ response,2,'_ sombedded.items),然后assertProperty等于(...)

如何以不会花费5倍的时间编写生产代码

2 个答案:

答案 0 :(得分:0)

我对PHP及其周围的工具堆不太熟悉,但一般来说,对于API测试以及任何测试,它确实远远超过生产代码,并且取决于您的JSON是如何生成,意味着它背后的逻辑,你可以写出非常聪明的测试。

例如,让我们假设您有一个API端点,它获取JSON输入并生成JSON作为输出,这意味着显然,您知道它的逻辑。因此,您可以做的是,在代码中使用一个测试JSON并将测试JSON作为输出进行匹配,并在测试模式下测试调用API并发布JSON并将其与输出JSON断言,在这种情况下,可以匹配所有动态字段。

除此之外,API在哪种语言中无关紧要,为了在测试环境或分段上实时测试,您可以使用REST AssuredKarate之类的工具,或者更多更多。我相信有些工具/框架也可以很好地与PHP集成。

答案 1 :(得分:0)

你可以用apitest测试

{
  test1: {
    req: {

    },
    res: {
      body: {
        "_links": {
          "self": {
            "href": "/api/v1/conversations"
          }
        },
        "_embedded": {
          "items": [ @partial
            {
              "id": 0, @type
              "name": "", @type
              "avatarUrl": `/^\/static\/avatars\/\w+\.png$/.test($)`, @eval
              "createdAt": "isDate($)", @eval
              "updatedAt": "isDate($)", @eval
              "_links": {
                "self": {
                  "href": `/^\/api\/v1\/conversations\/\d+/.test($)`, @eval
                }
              }
            },
          ]
        }
      }
    }
  }
}

Apitest 是声明式 api 测试工具,具有类似 JSON 的 DSL。

https://github.com/sigoden/apitest