JUnit


■内容

Top

■JUnit とは

Top
■参考URL
Top

■Eclipse 上で JUnit を使用する

  1. [対象クラスの上で右クリック]-[新規]-[JUnit テストケース]でつぎを設定
     ソース・フォルダー:                        デフォルトが設定される
     パッケージ:                                デフォルトが設定される
     テスト・ケース:                            デフォルトが設定される       
     テスト・クラス:                            対象クラスが設定される
     スーパークラス:                            Junit.framework.TestCase:    
     メソッド・スタブ作成
         public static void main(String[] args): チェック
             TestRunner ステートメントの追加:    チェック
         setUp():                                チェック
         tearDown():                             チェック
    
  2. なお、プロジェクトに対する初回設定時のみ、つぎの作業を行います。
    • [junit.jar を Javaのビルド・パス上に追加

      • [パッケージの上で右クリック]-[新規]-[その他]-[Java]-[JUnit]-[TestSuite]でつぎを設定
         ソース・フォルダー:                        デフォルトが設定される
         パッケージ:                                デフォルトが設定される
         テスト・スイート:                          AllTests    
         スイートに含まれるテスト・クラス:          すべて選択
         メイン用のメソッド・スタブ作成
             public static void main(String[] args): チェック
                 TestRunner ステートメントの追加:    チェック
        
Top

■JUnit の assert メソッド

Top

■JUnit を使った単体テスト例

  1. 任意の 3 つの数値 a, b, c が与えられたとき、その 3 つの数値が 3 角形を作るか否かを判定するメソッド "isTriangle()" を作り、JUnit を使ってテストしてください。

    "Triangle01.java"

    1. public class Triangle01 {
    2. static boolean isTriangle(int a, int b, int c) {
    3. // どれかひとつでも負またはゼロなら三角形ではありません。
    4. if (a <= 0 || b <= 0 || c <= 0) {
    5. return false;
    6. }
    7. // ある辺が残りの2つの和よりも長いか等しければ、三角形ではありません。
    8. if (a >= b + c || b >= c + a || c >= a + b) {
    9. return false;
    10. }
    11. // 三角形です。
    12. return true;
    13. }
    14. }
      No.  条件                      戻り値  データ
           (1) (2) (3) (4) (5) (6)           (a, b, c)      (1) a <= 0  
     ---- -------------------------  ------  -----------    (2) b <= 0
       1.   t   f   f   -   -   -       f    (0, 1, 1)      (3) c <= 0 
       2.   f   t   f   -   -   -       f    (1, 0, 1)      (4) a >= b + c 
       3.   f   f   t   -   -   -       f    (1, 1, 0)      (5) b >= c + a 
       4.   f   f   f   t   f   f       f    (2, 1, 1)      (6) c >= a + b
       5.   f   f   f   f   t   f       f    (1, 2, 1)
       6.   f   f   f   f   f   t       f    (1, 1, 2)
       7.   f   f   f   f   f   f       t    (1, 1, 1)
    
    

    "Triangle01Test.java"

    1. import junit.framework.TestCase;
    2. /**
    3. * @author Maruno
    4. *
    5. * No. 条件 戻り値 データ
    6. * (1) (2) (3) (4) (5) (6) (a, b, c) (1) a <= 0
    7. * ---- ------------------------- ------ ----------- (2) b <= 0
    8. * 1. t f f - - - f (0, 1, 1) (3) c <= 0
    9. * 2. f t f - - - f (1, 0, 1) (4) a >= b + c
    10. * 3. f f t - - - f (1, 1, 0) (5) b >= c + a
    11. * 4. f f f t f f f (2, 1, 1) (6) c >= a + b
    12. * 5. f f f f t f f (1, 2, 1)
    13. * 6. f f f f f t f (1, 1, 2)
    14. * 7. f f f f f f t (1, 1, 1)
    15. */
    16. public class Triangle01Test extends TestCase {
    17. public void testIsTriangle01() {
    18. assertEquals(false, Triangle01.isTriangle(0, 1, 1));
    19. }
    20. public void testIsTriangle02() {
    21. assertEquals(false, Triangle01.isTriangle(1, 0, 1));
    22. }
    23. public void testIsTriangle03() {
    24. assertEquals(false, Triangle01.isTriangle(1, 1, 0));
    25. }
    26. public void testIsTriangle04() {
    27. assertEquals(false, Triangle01.isTriangle(2, 1, 1));
    28. }
    29. public void testIsTriangle05() {
    30. assertEquals(false, Triangle01.isTriangle(1, 2, 1));
    31. }
    32. public void testIsTriangle06() {
    33. assertEquals(false, Triangle01.isTriangle(1, 1, 2));
    34. }
    35. public void testIsTriangle07() {
    36. assertEquals(true, Triangle01.isTriangle(1, 1, 1));
    37. }
    38. }

    □ 実行結果

    
    
  2. すべての商品情報を管理するクラス"ProductList.java"は、商品IDをもとに、商品情報を管理しています。

    □被テスト・クラス "ProductList.java"

    1. /*
    2. * 作成日: 2004/07/05
    3. *
    4. */
    5. package stock;
    6. import java.io.*;
    7. import java.util.*;
    8. /**
    9. * すべての商品情報を管理します。
    10. * <br/>
    11. * このクラスは、商品IDをもとに、商品情報を管理しています。
    12. * <br/>
    13. * 商品情報の初期値はパッケージルートに置きます。このオブジェクトを生成した時点で初期値ファイルからデータをロードします。
    14. * 初期値ファイルのデフォルト名は、"products.txt" です。形式はつぎのとおりです。
    15. * <br/>
    16. * <pre>
    17. *  商品ID,商品名
    18. * </pre>
    19. * @author Maruno
    20. * @version 1.0
    21. *
    22. */
    23. public class ProductList {
    24. Map products = new HashMap();
    25. /**
    26. * 商品リストをデフォルト・ファイルから作成します。
    27. */
    28. public ProductList() {
    29. this("products.txt");
    30. }
    31. /**
    32. * 商品リストをinitFileから作成します。
    33. * @param initFile 初期値データが入っているファイルを指定します。
    34. * ファイルは、CSV形式です。
    35. */
    36. public ProductList(String initFile) {
    37. setProducts(initFile);
    38. }
    39. /**
    40. * 商品オブジェクトをHashMapとして戻します。
    41. * @return 商品オブジェクト
    42. */
    43. public Map getProducts() {
    44. return products;
    45. }
    46. /**
    47. * @param map
    48. */
    49. private void setProducts(String initFile) {
    50. BufferedReader br;
    51. try {
    52. br = new BufferedReader(new FileReader(initFile));
    53. String s = null;
    54. while ((s = br.readLine()) != null) {
    55. String[] sa = s.split(",");
    56. products.put(sa[0], new Product(sa[0], sa[1]));
    57. }
    58. br.close();
    59. } catch (FileNotFoundException e) {
    60. System.out.println(e.getMessage());
    61. } catch (IOException e) {
    62. e.printStackTrace();
    63. }
    64. }
    65. /**
    66. * 指定されたIDがあるか否かを戻します。
    67. * @return あればtrue、ない場合はfalse。
    68. */
    69. public boolean contains(String id) {
    70. return products.containsKey(id);
    71. }
    72. /**
    73. * 指定されたIDの商品名を戻します。
    74. * @return あれば商品名、IDがない場合はnull。
    75. */
    76. public String getName(String id) {
    77. return contains(id) ? ((Product)(products.get(id))).getName() : null;
    78. }
    79. /**
    80. * すべての商品IDを配列で戻します。
    81. * @return 商品ID配列
    82. */
    83. public String[] getProductList() {
    84. String[] sa = new String[products.size()];
    85. int i = 0;
    86. for (Iterator e = (products.keySet()).iterator(); e.hasNext(); i++) {
    87. sa[i] = (String)(e.next());
    88. }
    89. return sa;
    90. }
    91. }
    □テスト・クラス "ProductListTest.java"
    1. /*
    2. * 作成日: 2004/07/05
    3. *
    4. * この生成されたコメントの挿入されるテンプレートを変更するため
    5. * ウィンドウ > 設定 > Java > コード生成 > コードとコメント
    6. */
    7. package stock;
    8. import junit.framework.TestCase;
    9. /**
    10. * @author Administrator
    11. *
    12. * この生成されたコメントの挿入されるテンプレートを変更するため
    13. * ウィンドウ > 設定 > Java > コード生成 > コードとコメント
    14. */
    15. public class ProductListTest extends TestCase {
    16. ProductList pl = new ProductList();
    17. ProductList pn = new ProductList("null.txt");
    18. ProductList pd = new ProductList("dummy.txt");
    19. /**
    20. * Constructor for ProductListTest.
    21. * @param arg0
    22. */
    23. public ProductListTest(String arg0) {
    24. super(arg0);
    25. }
    26. /*
    27. * 1.引数なしコンストラクターの確認
    28. */
    29. public void test01() {
    30. assertNotNull(new ProductList());
    31. }
    32. /*
    33. * 2.引数つきコンストラクターの確認
    34. */
    35. public void test02() {
    36. assertNotNull(new ProductList("products.txt"));
    37. }
    38. /*
    39. * 3.getProducts()の確認
    40. */
    41. public void test03() {
    42. assertEquals(20, (pl.getProducts()).size());
    43. }
    44. /*
    45. * 4.contains()でtrueの確認
    46. */
    47. public void test04() {
    48. assertTrue(pl.contains("S0006"));
    49. }
    50. /*
    51. * 5.contains()でfalseの確認
    52. */
    53. public void test05() {
    54. assertFalse(pl.contains("B006"));
    55. }
    56. /*
    57. * 6.getName()の確認(商品IDがある場合)
    58. */
    59. public void test06() {
    60. assertEquals("いちごクッキー", pl.getName("S0003"));
    61. }
    62. /*
    63. * 7.getName()の確認(商品IDがない場合)
    64. */
    65. public void test07() {
    66. assertNull(pl.getName("X0003"));
    67. }
    68. /*
    69. * 8.getProductList()の確認
    70. */
    71. public void test08() {
    72. assertEquals(20, pl.getProductList().length);
    73. }
    74. /*
    75. * 11.1レコードもない初期値ファイルの場合
    76. */
    77. public void test11() {
    78. assertNotNull(new ProductList("null.txt"));
    79. }
    80. /*
    81. * 12.getProducts()の確認
    82. */
    83. public void test12() {
    84. assertEquals(0, (pn.getProducts()).size());
    85. }
    86. /*
    87. * 13.contains()でfalseの確認
    88. */
    89. public void test13() {
    90. assertFalse(pn.contains("B0006"));
    91. }
    92. /*
    93. * 14.getName()の確認(商品IDがない場合)
    94. */
    95. public void test14() {
    96. assertNull(pn.getName("B0003"));
    97. }
    98. /*
    99. * 15.getProductList()の確認
    100. */
    101. public void test15() {
    102. assertEquals(0, pn.getProductList().length);
    103. }
    104. /*
    105. * 21.存在しないファイルを指定した場合
    106. */
    107. public void test21() {
    108. assertNotNull(new ProductList("dummy.txt"));
    109. }
    110. /*
    111. * 22.getProducts()の確認
    112. */
    113. public void test22() {
    114. assertEquals(0, (pd.getProducts()).size());
    115. }
    116. /*
    117. * 23.contains()でfalseの確認
    118. */
    119. public void test23() {
    120. assertFalse(pd.contains("B0006"));
    121. }
    122. /*
    123. * 24.getName()の確認(商品IDがない場合)
    124. */
    125. public void test24() {
    126. assertNull(pd.getName("B0003"));
    127. }
    128. /*
    129. * 25.getProductList()の確認
    130. */
    131. public void test25() {
    132. assertEquals(0, pd.getProductList().length);
    133. }
    134. public static void main(String[] args) {
    135. junit.textui.TestRunner.run(ProductListTest.class);
    136. }
    137. /*
    138. * @see TestCase#setUp()
    139. */
    140. protected void setUp() throws Exception {
    141. super.setUp();
    142. }
    143. /*
    144. * @see TestCase#tearDown()
    145. */
    146. protected void tearDown() throws Exception {
    147. super.tearDown();
    148. }
    149. }

    □ 実行結果

    
    
Top
■JUnit テスト・スイート
Top

inserted by FC2 system