1

アプリケーションが依存している API をテストするために、API ブループリントと Dredd を組み合わせて使用​​しています。API ブループリントで属性を使用して、応答の本文の構造を定義しています。

APIの応答に欠落していることがわかっている偽の「必須」パラメーターを意図的に定義したにもかかわらず、テストは常にパスするため、明らかに何かが欠けています。Dredd は、型その中のパラメーターではなく、応答本文 (配列)の型をテストしているだけのようです。

私の API ブループリント ファイル:

FORMAT: 1A
HOST: http://somehost.net

# API Title

## Endpoints [GET /endpoint/{date}]

+ Parameters

  + date: `2016-09-01` (string, required) - Date

+ Response 200 (application/json; charset=utf-8)

    + Attributes (array[Data])


## Data Structures

### Data

- realParameter: 2432432 (number)
- realParameter2: `some string` (string, required)
- realParameter3: `Something else` (string, required)
- realParameter4: 1 (number, required)
- fakeParam: 1 (number, required)

応答本文:

[
  {
    "realParameter": 31,
    "realParameter2": "some value",
    "realParameter3": "another value",
    "realParameter4": 8908
  },
  {
    "realParameter": 54,
    "realParameter2": "something here",
    "realParameter3": "and here too",
    "realParameter4": 6589
  }
]

そして、私の Dredd 設定ファイル:

reporter: apiary
custom:
  apiaryApiKey: somekey
  apiaryApiName: somename
dry-run: null
hookfiles: null
language: nodejs
sandbox: false
server: null
server-wait: 3
init: false
names: false
only: []
output: []
header: []
sorted: false
user: null
inline-errors: false
details: false
method: []
color: true
level: info
timestamp: false
silent: false
path: []
blueprint: myApiBlueprintFile.apib
endpoint: 'http://ahost.com'

「fakeParameter」が実際には応答本文に表示されず、テストに合格できるという事実を Dredd が無視する理由を知っている人はいますか?

4

1 に答える 1

1

API ブループリントが属性を記述するために使用する言語であるMSONの制限に遭遇しました。多くの場合、MSON は、正確に存在しなければならないものではなく、データ構造に存在する可能性があるものを記述します。

最も顕著なケースは配列です。基本的に、配列のコンテンツはすべてオプションであり、そのため、生成された基になる JSON スキーマは配列のコンテンツに制約を課しません。ドレッドはそれを尊重しているだけなので、間接的にはドレッドの問題にもなりますが、ドレッドにできることはあまりありません。

この問題には問題があります: apiaryio/mson#66この問題をフォローしてコメントすると、これに関する最新情報を入手できます。Dredd は通常、最新の API ブループリント パーサーを非常に迅速に取得するため、言語自体に実装されると、Dredd に表示されるまでにそれほど時間はかかりません。

+ Schema明らかな (しかし退屈な) 回避策は、セクションと一緒にセクションを使用して、より厳密なルールで独自の JSON スキーマを指定すること+ Attributesです。

于 2016-09-06T15:11:45.870 に答える