4

次のテスト出力を検討してください。

私の状況を説明する合格試験仕様`

要約すると、Word文書はサポートされておらず、PDFはサポートされています。そのため、Word文書はすぐに拒否します。ただし、PDFの場合、テストが必要な手順は他にもたくさんあるので、それらを実行します。

問題は、PDFとまったく同じワークフローを持つテキストファイルもサポートしたいとします。私がテストしているコードは、基本的に次のようになります。

function uploadDocument(type, document) {
    if (type !== "application/pdf" && type !== "text/plain") {
        throw new UnsupportedMediaTypeError();
    }

    // do all the steps involving temp documents, hashing, ownership, etc.
}

私の質問は、これに対するテストをどのように構成できるかということです。「PDFをアップロードするとき」の下にあるツリー全体を「テキストファイルをアップロードするとき」として複製したくありません。

この問題に何度も遭遇したような気がします。ご覧のとおり、私はすでにいくつかの複製を行っています(「一時文書の削除は成功します」と「一時文書のコミットは成功します」の下のエントリは同じです)。

基本的に、これはシステムの複数の次元を変化させ、それらを組み合わせてテストするという問題です。誰かがそのようなテストをどのように構成するかを考えたに違いありません。

4

2 に答える 2

1

これを2つのテストに分割する必要があるようです(おそらくそれ以上ですが、それは別のテーマです)

Given A document of type <doc_type> 
Then it should have an allowed status of  <status>

Examples:
| doc_type | status  | 
| word      | fail   | 
| text      | accept | 
| pdf       | accept | 

そして、あなたのテストは単純化されます

...
when uploading a valid file type
...

ハッピーテスト、Llewellyn

于 2012-06-11T12:12:58.367 に答える
0

あなたの例を次のように理解しています。

  • サポートされているメディア タイプとサポートされていないメディア タイプを区別します。
  • サポートされていないすべてのメディアの動作は同じです
  • サポートされているすべてのメディアの動作は同じです
  • サポートされているメディアの場合、コンテンツは使用されますが、生のバイト (ハッシュ) としてのみ使用されます

したがって、サポートされているメディアの種類が異なる場合にテストを 2 回実行する価値はほとんどないように思われます。使用している可能性のあるさまざまな開発プロセスについて、これを説明しましょう。

可能性 BDD を実行している場合、実装を「駆動」するためにテストが選択されます。ただし、pdf 用にすべてを実装した後は、コードは既に配置されています。&& type !== "text/plain"分数を追加するために「駆動」する追加のテスト ケースが 1 つだけ必要です。複製ツリーからの他のすべてのテストでは、余分なコードを追加する必要はありません。したがって、複製ツリーからのテストには「駆動」特性がありません。

可能性 b. テストケースの設計を行っており、BDD 表記を使用してテストを作成しています。この場合の目標は、考えられるバグを見つけるテスト スイートを定義することです。コードに関するホワイトボックスの知識があります。つまり、pdf ファイルとテキスト ファイルの処理が同じであることを知っています。したがって、追加のバグが見つかる可能性がある場合は、pdf ファイルとテキスト ファイルに対して異なるテスト ケースを作成するだけで済みます。ここにはいくつかのシナリオが存在する可能性があります。たとえば、ファイル拡張子によってファイルの保存が妨げられる場合がありますが、ほとんどの場合、すべてのシナリオにこの区別が関係するわけではありません。

可能性 c. 最後に、b に似た可能性のあるシナリオがありますが、ホワイト ボックスの知識がありません。テストケースの例で内部がどのように議論されているかを考えると、これは実際にはあなたの例に適合しないため、これについては詳しく説明しません。

テストのレベルについて説明してきましたが、設計のレベルでも言及すべきことがあります。コードは、a) サポートされているメディアとサポートされていないメディアを区別し、b) サポートされているすべてのメディアを同様に処理します。これはすべて同じ関数内で行われるため、最初にテストを複製することを検討した理由でさえあるかもしれません: この大きな関数では引数typeとの両方documentにアクセスできるため、誰かがtype処理部分で使用することさえあり、あまり一般的ではなくなります。別の関数でさまざまな責任を処理することを検討してから、関数を個別にテストします。型がサポートされているかどうかを判断する 1 つの関数 (type引数のみを使用) と、サポートされているドキュメントの処理を行う 1 つの関数 (document引数のみを使用) です。

于 2019-01-14T20:38:39.507 に答える