about junit
TRANSCRIPT
JUnit(xUnit)
• ユニットテストを行うテスティングフレームワーク
• 自動化テストの仕組みを提供
• テストケース記述法
• アサーションAPI
• テストランナー
• テストフィクスチャ
JUnitによるユニットテスト記述
• テストケース(テスト項目)
• 下記3つを定義・検証するもの
• テストの前提条件
• テスト対象に与えるの入力
• 期待される結果
• 「ある状況で、ある入力を与えた時に期待される結果」を検証するコード
JUnitによるユニットテスト記述
• https://github.com/shuji/practice-junit/tree/master/junit-tutorial
JUnitによるユニットテストのパターン
• 1. 標準的な振る舞いの検証
• テストケース間で共通する初期化/後処理の記述
• @Before,@Afterアノテーションを付与したメソッド
• (若しくはsetUp(), tearDown())
• テストケース毎に毎回呼ばれる
• https://phpunit.de/manual/current/ja/appendixes.annotations.html#appendixes.annotations.before
• https://github.com/shuji/practice-junit/blob/b4674819f8bb59d63fbca1621cde6198f380c88d/junit-exercises/src/test/java/ch18/ex03/CounterTest.java
JUnitによるユニットテストのパターン
• 1. 標準的な振る舞いの検証
• テストケース間で共通する初期化/後処理の記述2
• @BeforeClass,@AfterClassアノテーションを付与したメソッド
• テストクラスの1つ目のテストメソッド実行前/すべてのテストメソッド実行後に一度だけ呼ばれる
• https://phpunit.de/manual/current/ja/appendixes.annotations.html#appendixes.annotations.beforeClass
• https://github.com/shuji/practice-junit/blob/b4674819f8bb59d63fbca1621cde6198f380c88d/junit-examples/src/test/java/ch03/BeforeClassAndAfterClassTest.java
JUnitによるユニットテストのパターン
• 2. 例外送出検証
• 異常時に期待された例外がスローされるか検証
• アノテーションに期待する例外を記載
• phpunit => @expectedException
• https://phpunit.de/manual/current/ja/writing-tests-for-phpunit.html#writing-tests-for-phpunit.exceptions
• https://phpunit.de/manual/current/ja/writing-tests-for-phpunit.html#writing-tests-for-phpunit.exceptions
JUnitによるユニットテストのパターン
• 3. コンストラクタの検証
• インスタンス生成後に正しくフィールドが初期化されているか検証
• https://github.com/shuji/practice-junit/blob/b4674819f8bb59d63fbca1621cde6198f380c88d/junit-examples/src/test/java/ch03/ConstructorTest.java
わかりやすいテストコードのために 〜用語〜
• テスト対象
• SUT(System Under Test)
• テスト対象のインスタンスの変数名を「sut」にすると、理解しやすい(らしい)
• Clazz sut = new Class()
わかりやすいテストコードのために 〜用語〜
• 実測値/期待値
• expected/actual
• expected = “expected”;
• actual = sut.foo();
• assertEquals(actula, expected);
わかりやすいテストコードのために 〜副作用をなくす〜
• メソッドが戻り値を持つ
• 例:lfSelectFoo()がSelect文の結果をreturn
• オブジェクトの内部状態を確認するしなくて済む
• ☓ $this->arrResultに代入
わかりやすいテストコードのために 〜副作用をなくす〜
• 同じ引数で実行 ⇒ 常に同じ結果
• 参照透過性
• 現在時刻などの何らかの変動する実測値・外部状態を使用している
• ⇒モックオブジェクトなどを使う必要性