<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                #### [JUnit](https://lingcoder.gitee.io/onjava8/#/book/16-Validating-Your-Code?id=junit) 最初的 JUnit 發布于 2000 年,大概是基于 Java 1.0,因此不能使用 Java 的反射工具。因此,用舊的 JUnit 編寫單元測試是一項相當繁忙和冗長的工作。我發現這個設計令人不爽,并編寫了自己的單元測試框架作為[注解](https://lingcoder.gitee.io/onjava8/#/./Annotations)一章的示例。這個框架走向了另一個極端,“嘗試最簡單可行的方法”(極限編程中的一個關鍵短語)。從那之后,JUnit 通過反射和注解得到了極大的改進,大大簡化了編寫單元測試代碼的過程。在 Java8 中,他們甚至增加了對 lambdas 表達式的支持。本書使用當時最新的 Junit5 版本 在 JUnit 最簡單的使用中,使用**@Test**注解標記表示測試的每個方法。JUnit 將這些方法標識為單獨的測試,并一次設置和運行一個測試,采取措施避免測試之間的副作用。 讓我們嘗試一個簡單的例子。**CountedList**繼承**ArrayList**,添加信息來追蹤有多少個**CountedLists**被創建: ~~~ // validating/CountedList.java // Keeps track of how many of itself are created. package validating; import java.util.*; public class CountedList extends ArrayList<String> { private static int counter = 0; private int id = counter++; public CountedList() { System.out.println("CountedList #" + id); } public int getId() { return id; } } ~~~ 標準做法是將測試放在它們自己的子目錄中。測試還必須放在包中,以便 JUnit 能發現它們: ~~~ // validating/tests/CountedListTest.java // Simple use of JUnit to test CountedList. package validating; import java.util.*; import org.junit.jupiter.api.*; import static org.junit.jupiter.api.Assertions.*; public class CountedListTest { private CountedList list; @BeforeAll static void beforeAllMsg() { System.out.println(">>> Starting CountedListTest"); } @AfterAll static void afterAllMsg() { System.out.println(">>> Finished CountedListTest"); } @BeforeEach public void initialize() { list = new CountedList(); System.out.println("Set up for " + list.getId()); for(int i = 0; i < 3; i++) list.add(Integer.toString(i)); } @AfterEach public void cleanup() { System.out.println("Cleaning up " + list.getId()); } @Test public void insert() { System.out.println("Running testInsert()"); assertEquals(list.size(), 3); list.add(1, "Insert"); assertEquals(list.size(), 4); assertEquals(list.get(1), "Insert"); } @Test public void replace() { System.out.println("Running testReplace()"); assertEquals(list.size(), 3); list.set(1, "Replace"); assertEquals(list.size(), 3); assertEquals(list.get(1), "Replace"); } // A helper method to simplify the code. As // long as it's not annotated with @Test, it will // not be automatically executed by JUnit. private void compare(List<String> lst, String[] strs) { assertArrayEquals(lst.toArray(new String[0]), strs); } @Test public void order() { System.out.println("Running testOrder()"); compare(list, new String[] { "0", "1", "2" }); } @Test public void remove() { System.out.println("Running testRemove()"); assertEquals(list.size(), 3); list.remove(1); assertEquals(list.size(), 2); compare(list, new String[] { "0", "2" }); } @Test public void addAll() { System.out.println("Running testAddAll()"); list.addAll(Arrays.asList(new String[] { "An", "African", "Swallow"})); assertEquals(list.size(), 6); compare(list, new String[] { "0", "1", "2", "An", "African", "Swallow" }); } } /* Output: >>> Starting CountedListTest CountedList #0 Set up for 0 Running testRemove() Cleaning up 0 CountedList #1 Set up for 1 Running testReplace() Cleaning up 1 CountedList #2 Set up for 2 Running testAddAll() Cleaning up 2 CountedList #3 Set up for 3 Running testInsert() Cleaning up 3 CountedList #4 Set up for 4 Running testOrder() Cleaning up 4 >>> Finished CountedListTest */ ~~~ **@BeforeAll**注解是在任何其他測試操作之前運行一次的方法。**@AfterAll**是所有其他測試操作之后只運行一次的方法。兩個方法都必須是靜態的。 **@BeforeEach**注解是通常用于創建和初始化公共對象的方法,并在每次測試前運行。可以將所有這樣的初始化放在測試類的構造函數中,盡管我認為**@BeforeEach**更加清晰。JUnit為每個測試創建一個對象,確保測試運行之間沒有副作用。然而,所有測試的所有對象都是同時創建的(而不是在測試之前創建對象),所以使用**@BeforeEach**和構造函數之間的唯一區別是**@BeforeEach**在測試前直接調用。在大多數情況下,這不是問題,如果你愿意,可以使用構造函數方法。 如果你必須在每次測試后執行清理(如果修改了需要恢復的靜態文件,打開文件需要關閉,打開數據庫或者網絡連接,etc),那就用注解**@AfterEach**。 每個測試創建一個新的**CountedListTest**對象,任何非靜態成員變量也會在同一時間創建。然后為每個測試調用**initialize()**,于是 list 被賦值為一個新的用字符串“0”、“1” 和 “2” 初始化的**CountedList**對象。觀察**@BeforeEach**和**@AfterEach**的行為,這些方法在初始化和清理測試時顯示有關測試的信息。 **insert()**和**replace()**演示了典型的測試方法。JUnit 使用**@Test**注解發現這些方法,并將每個方法作為測試運行。在方法內部,你可以執行任何所需的操作并使用 JUnit 斷言方法(以"assert"開頭)驗證測試的正確性(更全面的"assert"說明可以在 Junit 文檔里找到)。如果斷言失敗,將顯示導致失敗的表達式和值。這通常就足夠了,但是你也可以使用每個 JUnit 斷言語句的重載版本,它包含一個字符串,以便在斷言失敗時顯示。 斷言語句不是必須的;你可以在沒有斷言的情況下運行測試,如果沒有異常,則認為測試是成功的。 **compare()**是“helper方法”的一個例子,它不是由 JUnit 執行的,而是被類中的其他測試使用。只要沒有**@Test**注解,JUnit 就不會運行它,也不需要特定的簽名。在這里,**compare()**是私有方法 ,表示僅在測試類中使用,但他同樣可以是**public**。其余的測試方法通過將其重構為**compare()**方法來消除重復的代碼。 本書使用**build.gradle**控制測試,運行本章節的測試,使用命令:`gradlew validating:test`,Gradle 不會運行已經運行過的測試,所以如果你沒有得到測試結果,得先運行:`gradlew validating:clean`。 可以用下面這個命令運行本書的所有測試: **gradlew test** 盡管可以用最簡單的方法,如**CountedListTest.java**所示那樣,JUnit 還包括大量的測試結構,你可以到[官網](https://lingcoder.gitee.io/onjava8/#/junit.org)上學習它們。 JUnit 是 Java 最流行的單元測試框架,但也有其它可以替代的。你可以通過互聯網發現更適合的那一個。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看