m個のディレクトリ
テスティング
パーティショニングによってテストケースを選択します
- パーティション内の境界を含めます
- 両極端partionを覆います
- 完全なデカルト積
- 各一部を覆います
JUnitを用いた自動ユニットテスト
+ @Test(注释)
+ assertEquals(expected result,actual result)
+ assertTrue()
+ assertFalse()
- あなたのテスト戦略を文書化
- 方法指示
- テスト戦略
- ブラックボックスとガラスのボックステスト
- ブラックボックステスト:これらの関数の実際のコードを見ずにpartitonでコードをテストします。
- グラスボックス・テスト:機能が実際に実装されているかの知識にコードベースをテストします。
- カバレッジ
- ステートメントカバレッジ:いくつかのテストケースによって実行すべてのステートメントがありますか?
- ブランチカバレッジ:プログラム内のすべての場合またはwhile文に対して、両方が真といくつかのテストケースで撮影した偽の方向ですか?
- Path coverage:is every possible combination or branches——every path through the program——taken by some test case?
- A good coverage tool for Eclipse is EclEmma,green:be tested red:not be tested,yellow:always be wrong.
- Unit Testing vs. Integration Testing,and Stubs
- unit test:test a single module in isolation
- integration test:test a combination of modules,or even the entire program.
- A stub is often called a mock object.Stubs are an important technique when building large systems.
- Automated Testing and Regression Testing
- Automated Testing:running the tests and checking their results automatically.(But you have to come up with good test cases yourself.)
- Regression Testing:It’s very important when you modify your code.Run all your tests after every change.Whenever you find and fix a bug, take the input that elicited the bug and add it to your automated test suite as a test case.
- automated regression testing: the combination of two testing ways above.
- Summary:
- Test-first programming.Write tests before you write code.
- Partitioning and boundaries for choosing test cases systematically.
- Glass box testing and statement coverage for filling out a test suite.
- Unit-testing each module, in isolation as much as possible.
- Automated regression testing to keep bud from coming back.
中文总结:
将输入空间划分
- 1.把输入空间分成若干个包含一系列输入的子域,全部的子域并起来要能覆盖整个输入空间,在每个子域中选取至少一个测试用例组成我们的总的测试用例。子域的划分原则是,在同一个子域中的输入,在该函数都有类似的行为。
- 2.也可以将输出空间划分为子域,使我们的输出结果覆盖整个输出空间,以此来选择测试用例,不同通常将输入空间划分得到的测试集,就已经是一个充分的测试集了。
- 3.划分方法:首先确定整个输入空间,如果一个函数有两个参数(包括调用的那个对象。eg:BigInteger ab = a.multiply(b),其中multiply()方法就包含两个参数a和b),那么其输入空间就为二维空间。然后确定划分:划分就是使得不同的子域中的测试用例可能对于该函数会有不同的行为包括一些特殊值也要划分出来。例如multiply()方法就可以按如下划分:
- 最后在每个子域上随机地选择一个测试用例加入测试集中。
- 更进一步的划分技巧:将边界也作为一个子域,因为边界处最容易出现bug,常见的边界:
- 一个例子:
两种选择测试的策略
- 1.Full Cartesian product:对于划分之后的每个子域,都选取一个测试用例,比如multiply()的例子,选取了7*7=49个测试用例
- 2.Cover each part:每个子域中至多选择一个用例,比如在max()中,共有3*5*5个子域,但是有些测试是没有必要的,所以我们选择了5个测试用例。
使用Junit进行单元测试
使用assertEquals(,),assertTrue(,),assertFalse(,)等函数进行测试,其中第一个参数为期望值,第二个参数为实际值。
说明你的测试策略
上面的函数的测试策略如下:
黑盒测试和玻璃盒测试
- 黑盒测试:不知道函数的具体实现,只通过函数的接口说明(specification)来选择测试样例
- 玻璃盒测试:直到函数的具体实现,若对于不同的输入,函数的实现采用了不同的数据结构和算法,那么要把他们划分成不同子域。
覆盖率
- Statement coverage: is every statement run by some test case?
- Branch coverage: for every if or while statement in the program, are both the true and the false direction taken by some test case?
- パスカバレッジ: - プログラムを通じて、すべてのパス - いくつかのテストケースで撮影した枝のすべての可能な組み合わせがありますか?
- 強度を高めるために、上記の試験は、一般的に我々はそれにステートメントカバレッジに到達する必要があります。
- あなたは、各ステートメントが前に実行されたかどうかを検出するために、コード・カバレッジ・ツールを使用することができます。日食は良いツールEclEmmaです。グリーン実行した文を表し、文が赤の代わりに実行されていない、黄色の状態が虚偽です。図は次のとおりです。
- このとき、次のステップでは、条件が真である場合は、すべての文が緑色になりますように、テストケースを見つけることであり、このテストケースは、テスト・セットに追加しました。
モジュールのテストや統合テスト
- モジュールのテストは、より良いモジュールのバグを発見するだけでなく、全体的なテストのために良いですできます。接続モジュールのバグを見つける能力
自動テストや回帰テスト
- 自動テストフィンガー自動試験サンプルと決意した結果が正しいことを、自動テストは、JUnitのようなテストドライバを用いて行われます。彼らはあなたの自動選択、および出力試験結果の試験サンプルでテストすることができます。しかし、まだ研究の対象である試験サンプルの自動生成はありません。
- 回帰テストは、各コードを変更した後、テストケースは、再試験を再びです。そのため、コードへの変更の見える小さなバグにつながる可能性があります。そして、誤ったテストにつながることができ、プログラムを見つけ、およびテスト・セットに追加。コードの変更後も、このテストセットを使用して、新しい価値ある試験サンプルをテスト・セットに追加されていきます。