ホームページ  >  記事  >  Java  >  assertThat、assertEquals、assertTrue

assertThat、assertEquals、assertTrue

黄舟
黄舟オリジナル
2016-12-28 11:46:241667ブラウズ

昨夜は AgileChina 2011 のオープンハウスイベントで、私はコーディングセッションのボランティアとして参加しました。コーディング セッションの主な目的は、参加する開発者にペア プログラミング、テスト駆動開発、リファクタリングのプロセスを体験してもらうことです。会社では 8 ~ 9 人の同僚と参加する同僚がこのプロセスを一緒に体験できるように、次の 4 つの異なるタイプのプログラミングの質問を用意しました。

タイムシート

スーパーマーケットのレジ

ソースコードの行数

ブラックジャックゲーム

イベントは 2 つの小さな問題を除いて非常に成功しました:

1. 会社はこのイベントのために新しいキーボードとマウスを購入しましたが、入力するときの感触が悪く、キーボードのキーが平らでした。ある参加者はキーボードにあまり慣れていないため、いつも誤ってスラッシュを何度も入力してしまうことがあります。

2. システムのロック画面のショートカット キーが IDE の書式設定コードのショートカット キーと競合し、間違ったキーを 2 回入力して画面をロックしてしまいました。さらに、そのマシンは私のものではなく、入力を手伝ってくれる他の同僚を見つけなければなりませんでした。汗だくです。

Pair の最終ラウンドで、クラスメートが「assertEquals を使用しないのはなぜですか?」と尋ねました。皆さんはassertThatを使用しているようですが、assertEqualsやassertTrueなどの使用はあまり推奨されていないようです。

イベントも終わり間近で集合写真を撮る予定だったので、簡単に答えました。この質問に対する詳しい回答は次のとおりです。

アサーションから何を取得したいですか

テストのアサーションから何を取得したいですか?テストが失敗した後に赤いバーを表示するだけでは済みません。さらに、テストからいくつかの情報も取得したいと考えています。

1. テストが失敗したのはどこですか?すべてのアサーションがこの機能を提供できます

2. テストが失敗した理由を定義するのは困難です。ほとんどのアサーションは同様の機能を提供できます:

期待される結果と実際の結果

ただし、アサーションが異なれば提供される情報も異なります。等しいなどの単純な主張を使用して比較することが難しい問題もあります。さらに、アサーションには文書化という非常に重要な役割もあります。つまり、テスト コードを読むと、すべての期待を満たしているかのようにアサーションが表示されます。そして非常に明確な期待。

実際の例

assertThat の 2 番目のパラメータを見てください。org.hamcrest には非常に豊富な Matcher 実装があります。たとえば、API はユーザー オブジェクトのリストを返し、このリストに期待するユーザーが含まれていることをアサートしたいとします。hamcrest には hasItem のような Matcher があります。

   1: assertThat(userDAO.findAll(), hasItem(expected));

わかりました、これが問題です。上記の 2 つのアサーションが失敗した場合、最初のアサーションの失敗メッセージは次のようになります:

期待される結果には、expected…が含まれています。

しかし、実際には…ここで findAll が返されます。プリントアウトしてください

では、2 番目の主張はどうでしょうか?それは次のようなものです:

期待は正しいですが、実際には誤りです

どちらがより信頼できますか?明らかに、最初のアサーションの失敗情報の方が、問題を見つけるのに役立ちます。

ドキュメントとして、次の要件を見てみましょう: 返されたユーザー リストに特定のユーザーが含まれていないことをアサートします:

   1: assertTrue(userDAO.findAll().contains(expected));

このアサーションを読むと、コードを読んでいるとは感じられないでしょう。読書仕様のような。他のアサーションを使用する場合:

   1: assertThat(userDAO.findAll(), not(hasItem(expected));

は、前のアサーションほど詳しく文書化されていません。

もちろん、true または false を返す、または単一の値を返す一部の API では、他のアサーションを問題なく使用することもできます。例:

   1: assertFalse(userDAO.findAll().contains(expected));

ああ、何?私の使い方が間違っていたと言いましたが、なぜですか?パラメーターの説明を確認したところ、最初のパラメーターに期待値を入れ、2 番目のパラメーターに実際の値を入れる必要があることがわかりました。私の記憶力はあまりよくなく、いつも間違えてしまいます。幸いなことに、私たちは、

   1: assertEquals(userDAO.findBy(id), expected);

まだ間違えますか?

上記は、assertThat、assertEquals、およびassertTrueの内容です。さらに関連する内容については、PHP中国語Webサイト(www.php.cn)に注目してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。