กรอบการทดสอบ Espresso - ภาพรวมของ JUnit
ในบทนี้ให้เราทำความเข้าใจพื้นฐานของJUnitซึ่งเป็นกรอบการทดสอบหน่วยยอดนิยมที่พัฒนาโดยชุมชน Java ซึ่งสร้างกรอบการทดสอบเอสเปรสโซ
JUnitเป็นมาตรฐานโดยพฤตินัยสำหรับหน่วยทดสอบแอปพลิเคชัน Java แม้ว่าจะเป็นที่นิยมสำหรับการทดสอบหน่วย แต่ก็มีการสนับสนุนและข้อกำหนดสำหรับการทดสอบเครื่องมืออย่างครบถ้วนเช่นกัน ไลบรารีการทดสอบ Espresso ขยายคลาส JUnit ที่จำเป็นเพื่อรองรับการทดสอบเครื่องมือที่ใช้ Android
เขียนแบบทดสอบหน่วยง่ายๆ
ขอให้เราสร้างชั้น Java, การคำนวณ (Computation.java) และเขียนการคำนวณทางคณิตศาสตร์ที่เรียบง่ายสรุปและคูณ จากนั้นเราจะเขียนกรณีทดสอบโดยใช้JUnitและตรวจสอบโดยเรียกใช้กรณีทดสอบ
เริ่ม Android Studio
เปิดHelloWorldApp ที่สร้างในบทก่อนหน้า
สร้างไฟล์Computation.javaในapp / src / main / java / com / tutorialspoint / espressosamples / helloworldapp /และเขียนสองฟังก์ชัน - SumและMultiplyตามที่ระบุด้านล่าง
package com.tutorialspoint.espressosamples.helloworldapp;
public class Computation {
public Computation() {}
public int Sum(int a, int b) {
return a + b;
}
public int Multiply(int a, int b) {
return a * b;
}
}
สร้างไฟล์ ComputationUnitTest.java ใน app / src / test / java / com / tutorialspoint / espressosamples / helloworldapp และเขียน unit test case เพื่อทดสอบการทำงานของ Sum และ Multiply ตามที่ระบุด้านล่าง
package com.tutorialspoint.espressosamples.helloworldapp;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class ComputationUnitTest {
@Test
public void sum_isCorrect() {
Computation computation = new Computation();
assertEquals(4, computation.Sum(2,2));
}
@Test
public void multiply_isCorrect() {
Computation computation = new Computation();
assertEquals(4, computation.Multiply(2,2));
}
}
ที่นี่เราได้ใช้สองคำใหม่ - @TestและassertEquals โดยทั่วไป JUnit ใช้คำอธิบายประกอบ Java เพื่อระบุกรณีทดสอบในคลาสและข้อมูลเกี่ยวกับวิธีดำเนินการกรณีทดสอบ @Testเป็นหนึ่งในคำอธิบายประกอบ Java ซึ่งระบุว่าฟังก์ชันเฉพาะนั้นเป็นกรณีทดสอบจูนิท assertEqualsเป็นฟังก์ชันเพื่อยืนยันว่าอาร์กิวเมนต์แรก (ค่าที่คาดหวัง) และอาร์กิวเมนต์ที่สอง (ค่าที่คำนวณ) มีค่าเท่ากันและเหมือนกัน JUnitมีวิธีการยืนยันจำนวนมากสำหรับสถานการณ์การทดสอบที่แตกต่างกัน
ตอนนี้เรียกใช้ComputationUnitTestใน Android studio โดยคลิกขวาที่คลาสแล้วเรียกใช้ตัวเลือกRun 'ComputationUnitTest'ตามที่อธิบายไว้ในบทก่อนหน้า ซึ่งจะเรียกใช้กรณีทดสอบหน่วยและรายงานความสำเร็จ
ผลการทดสอบหน่วยคำนวณดังแสดงด้านล่าง -
คำอธิบายประกอบ
การใช้กรอบ JUnit คำอธิบายประกอบอย่างกว้างขวาง คำอธิบายประกอบที่สำคัญบางส่วนมีดังนี้ -
@Test
@Before
@After
@BeforeClass
@AfterClass
@Rule
@คำอธิบายประกอบการทดสอบ
@Testเป็นคำอธิบายประกอบที่สำคัญมากในกรอบงานJUnit @Testใช้เพื่อแยกความแตกต่างของวิธีการปกติจากวิธีกรณีทดสอบ เมื่อวิธีการที่มีการตกแต่งด้วย@Testคำอธิบายประกอบแล้วว่าวิธีการเฉพาะถือเป็นกรณีทดสอบและจะมีการดำเนินการโดยJUnit วิ่ง JUnit Runnerเป็นคลาสพิเศษซึ่งใช้เพื่อค้นหาและรันกรณีทดสอบ JUnit ที่มีอยู่ในคลาส java ในตอนนี้เรากำลังใช้ตัวเลือก build in ของ Android Studioเพื่อเรียกใช้การทดสอบหน่วย (ซึ่งจะเรียกใช้JUnit Runner ) โค้ดตัวอย่างมีดังนี้
package com.tutorialspoint.espressosamples.helloworldapp;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class ComputationUnitTest {
@Test
public void multiply_isCorrect() {
Computation computation = new Computation();
assertEquals(4, computation.Multiply(2,2));
}
}
@ก่อน
@ ก่อนใช้คำอธิบายประกอบเพื่ออ้างอิงวิธีการซึ่งจำเป็นต้องเรียกใช้ก่อนที่จะเรียกใช้วิธีการทดสอบใด ๆ ที่มีอยู่ในคลาสทดสอบเฉพาะ ตัวอย่างเช่นในตัวอย่างของเราออบเจ็กต์การคำนวณสามารถสร้างขึ้นในวิธีการแยกต่างหากและใส่คำอธิบายประกอบด้วย@Beforeเพื่อให้ทำงานก่อนทั้งกรณีทดสอบsum_isCorrectและmultiply_isCorrect รหัสที่สมบูรณ์มีดังนี้
package com.tutorialspoint.espressosamples.helloworldapp;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class ComputationUnitTest {
Computation computation = null;
@Before
public void CreateComputationObject() {
this.computation = new Computation();
}
@Test
public void sum_isCorrect() {
assertEquals(4, this.computation.Sum(2,2));
}
@Test
public void multiply_isCorrect() {
assertEquals(4, this.computation.Multiply(2,2));
}
}
@หลังจาก
@Afterคล้ายกับ@Beforeแต่เมธอดที่ใส่คำอธิบายประกอบด้วย@Afterจะถูกเรียกหรือดำเนินการหลังจากรันแต่ละกรณีการทดสอบ โค้ดตัวอย่างมีดังนี้
package com.tutorialspoint.espressosamples.helloworldapp;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class ComputationUnitTest {
Computation computation = null;
@Before
public void CreateComputationObject() {
this.computation = new Computation();
}
@After
public void DestroyComputationObject() {
this.computation = null;
}
@Test
public void sum_isCorrect() {
assertEquals(4, this.computation.Sum(2,2));
}
@Test
public void multiply_isCorrect() {
assertEquals(4, this.computation.Multiply(2,2));
}
}
@BeforeClass
@BeforeClassคล้ายกับ@Beforeแต่เมธอดที่ใส่คำอธิบายประกอบด้วย@BeforeClassจะถูกเรียกหรือดำเนินการเพียงครั้งเดียวก่อนที่จะรันกรณีทดสอบทั้งหมดในคลาสเฉพาะ มีประโยชน์ในการสร้างวัตถุที่ใช้ทรัพยากรอย่างเข้มข้นเช่นวัตถุเชื่อมต่อฐานข้อมูล ซึ่งจะช่วยลดเวลาในการดำเนินการรวบรวมกรณีทดสอบ วิธีนี้จำเป็นต้องคงที่เพื่อให้ทำงานได้อย่างถูกต้อง ในตัวอย่างของเราเราสามารถสร้างออบเจ็กต์การคำนวณหนึ่งครั้งก่อนที่จะรันกรณีทดสอบทั้งหมดตามที่ระบุด้านล่าง
package com.tutorialspoint.espressosamples.helloworldapp;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class ComputationUnitTest {
private static Computation computation = null;
@BeforeClass
public static void CreateComputationObject() {
computation = new Computation();
}
@Test
public void sum_isCorrect() {
assertEquals(4, computation.Sum(2,2));
}
@Test
public void multiply_isCorrect() {
assertEquals(4, computation.Multiply(2,2));
}
}
@หลังเลิกเรียน
@AfterClassคล้ายกับ@BeforeClassแต่เมธอดที่ใส่คำอธิบายประกอบด้วย@AfterClassจะถูกเรียกหรือดำเนินการเพียงครั้งเดียวหลังจากรันกรณีทดสอบทั้งหมดในคลาสเฉพาะ วิธีนี้ยังต้องเป็นแบบคงที่เพื่อให้ทำงานได้อย่างถูกต้อง โค้ดตัวอย่างมีดังนี้ -
package com.tutorialspoint.espressosamples.helloworldapp;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class ComputationUnitTest {
private static Computation computation = null;
@BeforeClass
public static void CreateComputationObject() {
computation = new Computation();
}
@AfterClass
public static void DestroyComputationObject() {
computation = null;
}
@Test
public void sum_isCorrect() {
assertEquals(4, computation.Sum(2,2));
}
@Test
public void multiply_isCorrect() {
assertEquals(4, computation.Multiply(2,2));
}
}
@ กฎ
@Ruleคำอธิบายประกอบเป็นหนึ่งในไฮไลท์ของJUnit ใช้เพื่อเพิ่มพฤติกรรมให้กับกรณีทดสอบ เราสามารถใส่คำอธิบายประกอบในฟิลด์ประเภทTestRuleเท่านั้น มันจริงให้ชุดคุณลักษณะที่จัดไว้ให้โดย@Beforeและ@Afterคำอธิบายประกอบ แต่ในทางที่มีประสิทธิภาพและนำมาใช้ใหม่ ตัวอย่างเช่นเราอาจต้องการโฟลเดอร์ชั่วคราวเพื่อจัดเก็บข้อมูลบางส่วนในระหว่างการทดสอบ โดยปกติเราจำเป็นต้องสร้างโฟลเดอร์ชั่วคราวก่อนที่จะเรียกใช้กรณีทดสอบ (โดยใช้คำอธิบายประกอบ @Before หรือ @BeforeClass) และทำลายทิ้งหลังจากที่รันกรณีทดสอบแล้ว (ใช้คำอธิบายประกอบ @After หรือ @AfterClass) แต่เราสามารถใช้คลาสTemporaryFolder (ประเภทTestRule ) ที่จัดเตรียมโดยJUnit framework เพื่อสร้างโฟลเดอร์ชั่วคราวสำหรับกรณีทดสอบทั้งหมดของเราและโฟลเดอร์ชั่วคราวจะถูกลบออกเมื่อมีการเรียกใช้กรณีทดสอบ เราจำเป็นต้องสร้างตัวแปรใหม่ประเภทTemporaryFolderและต้องใส่คำอธิบายประกอบด้วย@Ruleตามที่ระบุด้านล่าง
package com.tutorialspoint.espressosamples.helloworldapp;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import java.io.File;
import java.io.IOException;
import static junit.framework.TestCase.assertTrue;
import static org.junit.Assert.assertEquals;
public class ComputationUnitTest {
private static Computation computation = null;
@Rule
public TemporaryFolder folder = new TemporaryFolder();
@Test
public void file_isCreated() throws IOException {
folder.newFolder("MyTestFolder");
File testFile = folder.newFile("MyTestFile.txt");
assertTrue(testFile.exists());
}
@BeforeClass
public static void CreateComputationObject() {
computation = new Computation();
}
@AfterClass
public static void DestroyComputationObject() {
computation = null;
}
@Test
public void sum_isCorrect() {
assertEquals(4, computation.Sum(2,2));
}
@Test
public void multiply_isCorrect() {
assertEquals(4, computation.Multiply(2,2));
}
}
ลำดับการดำเนินการ
ในJUnitวิธีการที่มีคำอธิบายประกอบที่แตกต่างกันจะดำเนินการตามลำดับที่ระบุดังที่แสดงด้านล่าง
@BeforeClass
@Rule
@Before
@Test
@After
@AfterClass
การยืนยัน
การยืนยันเป็นวิธีตรวจสอบว่าค่าที่คาดหวังของกรณีทดสอบตรงกับค่าจริงของผลกรณีทดสอบหรือไม่ JUnitให้การยืนยันสำหรับสถานการณ์ต่างๆ คำยืนยันที่สำคัญบางประการมีดังต่อไปนี้ -
fail() - เพื่อให้กรณีทดสอบล้มเหลวอย่างชัดเจน
assertTrue(boolean test_condition) - ตรวจสอบว่า test_condition เป็นจริง
assertFalse(boolean test_condition) - ตรวจสอบว่า test_condition เป็นเท็จ
assertEquals(expected, actual) - ตรวจสอบว่าทั้งสองค่าเท่ากัน
assertNull(object) - ตรวจสอบว่าวัตถุนั้นเป็นโมฆะ
assertNotNull(object) - ตรวจสอบว่าวัตถุนั้นไม่เป็นโมฆะ
assertSame(expected, actual) - ตรวจสอบว่าทั้งสองอ้างถึงวัตถุเดียวกัน
assertNotSame(expected, actual) - ตรวจสอบว่าทั้งสองหมายถึงวัตถุที่แตกต่างกัน