กรอบการทดสอบ 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) - ตรวจสอบว่าทั้งสองหมายถึงวัตถุที่แตกต่างกัน