ユニットテストのRight-BiCEP原則

3248 ワード

概要
1つの関数に対して包括的なユニットテストを行うのは容易ではありません.しかし、もしあなたがベテランであれば、彼がどのような状況で間違いを犯すかを知っていて、ユニットテストで検証することができます.しかし、初心者はどのようにして、どのように関数に対して全面的なユニットテストを行いますか?幸いなことに、ここにはいくつかの原則があります.
それは我々Right-BiCEP原則Right:結果が正しいかどうかB:Boundary、境界検出が正しいかどうかI:inverse、調整順序が正しいかどうかC:cross-check:リングテストE:error-condition:異常状況p:performance:性能曲線
結果が正しいかどうか
最も直接的で最も簡単なテストは、結果が正しいかどうかを確認することです.
もし結果が正しければ、私たちはどのように知っていますか.
ファイルデータの使用
テストが必要なデータが非常に膨大で複雑であれば、ファイルを借りて行うことができます.例を挙げてLargestをテストしますlargest(new int[]{});次の形式のファイルを使用できます.
#
#Simple test
#
9 9 8 7 6
9 7 8 9 6
9 8 7 6 9

#
#Negative number test
#
-7 -7 -8 -9 
-7 -8 -9 -7
-7 -9 -8 -7

#
#Mixture:
#
7 -9 -8 -7 7 6 5
0 -1 -2 -3 -5 -6 -7

#
#Boundary conditions
#
1 1
0 0
22222222 22222222
11111111 11111111


フォーマットは非常に簡単で、もちろんxmlやjsonフォーマットのより読みやすい方法でテストすることもできます.テストプログラムは対応するデータを読み取るだけで、1組1組のデータの読み取り、テスト.
いくつかのデータだけであれば、私たちはこのようにするのは少し大げさだと思います.しかし、万行以上のデータを設計するには、ファイルテストを読み取る方法で、テストをよりスムーズに行います.
きょうかいじょうけん
前のテストユニットでは、いくつかの境界条件を使用して、最大値を最初のまたは最後の1つに配置し、配列には負の数が含まれ、数値は1つの要素、空の配列しかありません.境界はユニットテストで最も考慮しなければならない場所です.これもバグが繁殖する場所だからです.次はいくつかの境界条件を考慮する必要があります
1:              ,         ,"!@#$#%$^%&
2:    ,           archy_yu@sina.
3:    ,   0,0.0,"",null
4:    ,      120,    12,    24  
5:         ,     
6:      ,        ,              ,               。

セルテストを行う際には,上記の6つの条件を考慮するだけで,境界状況をほぼ完全に考慮することができる.
リングテスト
いくつかの方法関数は,リングテストの過程で正確性を検証する必要がある.例えば,4の平方根に4を乗じた平凡な根を計算し,4と比較する.
public void testSquareRootUsingInverse(){
    double x = mySquareRoot(4.0);
    assertEquals(4.0,x*x,0.00001);
}

例は簡単ですが、実用的です.データベース関連の場合は、挿入操作をしてから検索できます.
クロステストの比較
私たちは異なる方法で結果を得ることができて、それから結果を比較して、平凡な根を求める方法で見ると、私たちはこのようにテストすることができます.
public void testSquareRootUsingInverse(){
    double number = 3880900.0;
    double root1 = mySquareRoot(number);
    double root2 = Math.squre(number);
    assertEquals(root2,root1,0.00001);
}

例外
実際の生産環境では、どんな状況でも発生する可能性があります.ハードディスク(HDD)がいっぱいで、ネットが切れて、メールアドレスがブラックリストに入って、プログラムがクラッシュしました.これらの場合、コードの実行状況を検出する必要があります.
次は私たちが考えなければならない状況です.
  1     
  2     
  3     
  4      

せいのうきょくせん
私たちはこのような状況に遭遇したことがあります.私たちが発表した最初のバージョンはよく実行されていますが、2番目のバージョンになると、実行速度が遅くなって犬になりました.これはなぜですか.私たちがそれらを修正したのですか?いいえ、もともと状況がますます複雑になって、流量がますます多くなって、処理するデータもますます多くなって、私たちの性能曲線は指数的に上昇してもたらしたので、どのようにこのような状況を避けて、性能曲線をテストするしかありません.例えば、ウェブサイトのセットが達成できるかどうかを検出します.最初は、いくつかのウェブサイトだけが検出されます.徐々に成長して、数百個になって、さらに数千個になって、性能はどうですか?
public void testUrlFilter(){
  Timer timer = new Timer();
  String backurl = "http://www.ascascasc.com";
  
  URLFilter filter = new URLFilter(smallList);
  timer.start();
  filter.check(backurl);
  timer.end();
  
  assertTrue(timer.elapsedTimer() <= 1.0);
  
  URLFilter f = URLFiler(bigList);
  timer.start();
  f.check(backurl);
  timer.end();
  assertTrue(timer.elapsedTimer() <= 2.0);

  URLFilter ff = URLFilter(hugeList);
  timer.start();
  ff.check(backurl);
  timer.end();
  assertTrue(timer.elapsedTimer() <= 3.0);
  

}

これにより、データ量が増加するにつれて、パフォーマンスがどのような成長形式であるかを検出し、アルゴリズムを最適化するか、需要を変更するかを分析することができます.