TestNG - คู่มือฉบับย่อ
การทดสอบเป็นกระบวนการตรวจสอบการทำงานของแอปพลิเคชันเพื่อให้แน่ใจว่าทำงานได้ตามข้อกำหนด การทดสอบหน่วยเป็นภาพรวมในระดับผู้พัฒนาซึ่งมีการใช้มาตรการที่เพียงพอเพื่อทดสอบเอนทิตี (คลาสหรือวิธีการ) เดียวเพื่อให้แน่ใจว่าผลิตภัณฑ์ขั้นสุดท้ายตรงตามข้อกำหนด
JUnit ได้ผลักดันให้นักพัฒนาเข้าใจถึงประโยชน์ของการทดสอบโดยเฉพาะการทดสอบหน่วยเมื่อเปรียบเทียบกับกรอบการทดสอบอื่น ๆ ด้วยการใช้สถาปัตยกรรมที่ค่อนข้างเรียบง่ายใช้งานได้จริงและเข้มงวด JUnit จึงสามารถ "แพร่เชื้อ" ให้กับนักพัฒนาจำนวนมากได้ ลองดูบทช่วยสอนของเราเกี่ยวกับ JUnit เพื่อให้เข้าใจถึงคุณสมบัติต่างๆเป็นอย่างดี ในขณะเดียวกัน JUnit ก็มีข้อบกพร่องบางประการเช่นกันซึ่งแสดงไว้ด้านล่าง -
เริ่มต้นออกแบบมาเพื่อเปิดใช้งานการทดสอบหน่วยเท่านั้นตอนนี้ใช้สำหรับการทดสอบทุกประเภท
ไม่สามารถทำการทดสอบการพึ่งพาได้
การควบคุมการกำหนดค่าไม่ดี (setUp / tearDown)
ล่วงล้ำ (บังคับให้คุณขยายชั้นเรียนและตั้งชื่อวิธีการของคุณด้วยวิธีใดวิธีหนึ่ง)
รูปแบบการเขียนโปรแกรมแบบคงที่ (บังคับให้คุณคอมไพล์ใหม่โดยไม่จำเป็น)
การจัดการชุดทดสอบต่างๆในโครงการที่ซับซ้อนอาจเป็นเรื่องยุ่งยากมาก
TestNG คืออะไร?
คำจำกัดความของ TestNG ตามเอกสารมีดังนี้ -
TestNG เป็นกรอบการทดสอบที่ได้รับแรงบันดาลใจจาก JUnit และ NUnit แต่มีฟังก์ชันใหม่บางอย่างที่ทำให้มีประสิทธิภาพและใช้งานง่าย
TestNG เป็นกรอบการทดสอบอัตโนมัติแบบโอเพนซอร์ส ที่ไหนNG หมายถึง Nต่อGeneration. TestNG คล้ายกับ JUnit (โดยเฉพาะ JUnit 4) แต่ไม่ใช่ส่วนขยาย JUnit ได้รับแรงบันดาลใจจาก JUnit ได้รับการออกแบบมาให้ดีกว่า JUnit โดยเฉพาะอย่างยิ่งเมื่อทดสอบคลาสรวม ผู้สร้าง TestNG เป็นเซดริก Beust
การขจัดข้อ จำกัด ส่วนใหญ่ของเฟรมเวิร์กรุ่นเก่า TestNG ช่วยให้นักพัฒนาสามารถเขียนการทดสอบที่ยืดหยุ่นและมีประสิทธิภาพมากขึ้น เนื่องจากมันยืมอย่างมากจาก Java Annotations (มาพร้อมกับ JDK 5.0) เพื่อกำหนดการทดสอบจึงสามารถแสดงวิธีใช้คุณลักษณะใหม่ของภาษา Java ในสภาพแวดล้อมการใช้งานจริง
คุณสมบัติ TestNG
รองรับคำอธิบายประกอบ
TestNG ใช้คุณสมบัติ Java และ OO เพิ่มเติม
รองรับการทดสอบคลาสรวม (เช่นโดยค่าเริ่มต้นไม่จำเป็นต้องสร้างอินสแตนซ์คลาสทดสอบใหม่สำหรับทุกวิธีการทดสอบ)
แยกรหัสทดสอบเวลาคอมไพล์ออกจากการกำหนดค่ารันไทม์ / ข้อมูลข้อมูล
การกำหนดค่ารันไทม์ที่ยืดหยุ่น
เปิดตัว 'กลุ่มทดสอบ' เมื่อคุณรวบรวมการทดสอบของคุณแล้วคุณสามารถขอให้ TestNG เรียกใช้การทดสอบ "ส่วนหน้า" ทั้งหมดหรือการทดสอบ "เร็ว" "ช้า" "ฐานข้อมูล" ฯลฯ
รองรับวิธีการทดสอบขึ้นอยู่กับการทดสอบแบบขนานการทดสอบโหลดและความล้มเหลวบางส่วน
API ปลั๊กอินที่ยืดหยุ่น
รองรับการทดสอบแบบมัลติเธรด
TestNG เป็นเฟรมเวิร์กสำหรับ Java ดังนั้นข้อกำหนดแรกสุดคือต้องติดตั้ง JDK ในเครื่องของคุณ
ความต้องการของระบบ
JDK | 1.5 ขึ้นไป |
หน่วยความจำ | ไม่มีข้อกำหนดขั้นต่ำ |
พื้นที่ดิสก์ | ไม่มีข้อกำหนดขั้นต่ำ |
ระบบปฏิบัติการ | ไม่มีข้อกำหนดขั้นต่ำ |
ขั้นตอนที่ 1 - ตรวจสอบการติดตั้ง Java ในเครื่องของคุณ
เปิดคอนโซลและดำเนินการคำสั่ง java ตามระบบปฏิบัติการที่คุณติดตั้งบนระบบของคุณ
ระบบปฏิบัติการ | งาน | คำสั่ง |
---|---|---|
Windows | เปิด Command Console | c: \> java - เวอร์ชัน |
ลินุกซ์ | เปิด Command Terminal | $ java - รุ่น |
Mac | เปิด Terminal | เครื่อง: ~ joseph $ java -version |
มาตรวจสอบผลลัพธ์สำหรับระบบปฏิบัติการทั้งหมด -
ระบบปฏิบัติการ | เอาต์พุต |
---|---|
Windows | เวอร์ชัน java "1.7.0_25" Java (TM) SE Runtime Environment (บิวด์ 1.7.0_25-b15) Java HotSpot (TM) 64-Bit Server VM (สร้าง 23.25-b01 โหมดผสม) |
ลินุกซ์ | เวอร์ชัน java "1.7.0_25" Java (TM) SE Runtime Environment (บิวด์ 1.7.0_25-b15) Java HotSpot (TM) 64-Bit Server VM (สร้าง 23.25-b01 โหมดผสม) |
Mac | เวอร์ชัน java "1.7.0_25" Java (TM) SE Runtime Environment (บิวด์ 1.7.0_25-b15) Java HotSpot (TM) 64-Bit Server VM (สร้าง 23.25-b01 โหมดผสม) |
หากคุณไม่มี Java ให้ติดตั้ง Java Software Development Kit (SDK) จาก https://www.oracle.com/technetwork/java/javase/downloads/index.html. เราถือว่า Java 1.7.0_25 เป็นเวอร์ชันที่ติดตั้งสำหรับบทช่วยสอนนี้
ขั้นตอนที่ 2: ตั้งค่าสภาพแวดล้อม JAVA
ตั้งค่า JAVA_HOMEตัวแปรสภาพแวดล้อมเพื่อชี้ไปยังตำแหน่งไดเร็กทอรีฐานที่ Java ติดตั้งบนเครื่องของคุณ ตัวอย่างเช่น,
ระบบปฏิบัติการ | เอาต์พุต |
---|---|
Windows | ตั้งค่าตัวแปรสภาพแวดล้อม JAVA_HOME เป็น C: \ Program Files \ Java \ jdk1.7.0_25 |
ลินุกซ์ | ส่งออก JAVA_HOME = / usr / local / java-current |
Mac | ส่งออก JAVA_HOME = / Library / Java / Home |
ผนวกตำแหน่งคอมไพเลอร์ Java เข้ากับ System Path
ระบบปฏิบัติการ | เอาต์พุต |
---|---|
Windows | ต่อท้ายสตริง C: \ Program Files \ Java \ jdk1.7.0_25 \ bin ที่ส่วนท้ายของตัวแปรระบบ Path |
ลินุกซ์ | ส่งออกเส้นทาง =$PATH:$JAVA_HOME / bin / |
Mac | ไม่จำเป็นต้องใช้ |
ตรวจสอบการติดตั้ง Java โดยใช้คำสั่ง java -version ตามที่อธิบายไว้ข้างต้น
ขั้นตอนที่ 3: ดาวน์โหลด TestNG Archive
ดาวน์โหลดไฟล์ jar TestNG เวอร์ชันล่าสุดจาก http://www.testng.org. ในขณะที่เขียนบทช่วยสอนนี้เราได้ดาวน์โหลดtestng-6.8.jarและคัดลอกลงในโฟลเดอร์ C: \> TestNG
ระบบปฏิบัติการ | ชื่อที่เก็บถาวร |
---|---|
Windows | testng-6.8.jar |
ลินุกซ์ | testng-6.8.jar |
Mac | testng-6.8.jar |
ขั้นตอนที่ 4: ตั้งค่าสภาพแวดล้อม TestNG
ตั้งค่า TESTNG_HOMEตัวแปรสภาพแวดล้อมเพื่อชี้ไปยังตำแหน่งไดเร็กทอรีฐานโดยที่โถ TestNG ถูกเก็บไว้ในเครื่องของคุณ ตารางต่อไปนี้แสดงวิธีตั้งค่าตัวแปรสภาพแวดล้อมใน Windows, Linux และ Mac โดยสมมติว่าเราเก็บ testng-6.8.jar ไว้ที่ตำแหน่ง C: \> TestNG
ระบบปฏิบัติการ | คำอธิบาย |
---|---|
Windows | ตั้งค่าตัวแปรสภาพแวดล้อม TESTNG_HOME เป็น C: \ TESTNG |
ลินุกซ์ | ส่งออก TESTNG_HOME = / usr / local / TESTNG |
Mac | ส่งออก TESTNG_HOME = / Library / TESTNG |
ขั้นตอนที่ 5: ตั้งค่าตัวแปร CLASSPATH
ตั้งค่า CLASSPATH ตัวแปรสภาพแวดล้อมเพื่อชี้ไปที่ตำแหน่งโถ TestNG
ระบบปฏิบัติการ | คำอธิบาย |
---|---|
Windows | ตั้งค่าตัวแปรสภาพแวดล้อม CLASSPATH เป็น% CLASSPATH%;% TESTNG_HOME% \ testng-6.8.jar |
ลินุกซ์ | ส่งออก CLASSPATH =$CLASSPATH:$TESTNG_HOME / testng-6.8.jar |
Mac | ส่งออก CLASSPATH =$CLASSPATH:$TESTNG_HOME / testng-6.8.jar |
ขั้นตอนที่ 6: ทดสอบการตั้งค่า TestNG
สร้างไฟล์คลาส java ชื่อ TestNGSimpleTest ที่ C:\>TestNG_WORKSPACE.
import org.testng.annotations.Test;
import static org.testng.Assert.assertEquals;
public class TestNGSimpleTest {
@Test
public void testAdd() {
String str = "TestNG is working fine";
AssertEquals("TestNG is working fine", str);
}
}
TestNG สามารถเรียกใช้งานได้หลายวิธี -
- ด้วยไฟล์ testng.xml
- ด้วย ANT.
- จากบรรทัดคำสั่ง
ให้เราเรียกใช้โดยใช้ไฟล์ testng.xml สร้างไฟล์ xml โดยใช้ชื่อ testng.xml ในC:\>TestNG_WORKSPACE เพื่อดำเนินการกรณีทดสอบ
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<classes>
<class name = "TestNGSimpleTest"/>
</classes>
</test>
</suite>
ขั้นตอนที่ 7: ตรวจสอบผลลัพธ์
รวบรวมคลาสโดยใช้ javac คอมไพเลอร์ดังนี้ -
C:\TestNG_WORKSPACE>javac TestNGSimpleTest.java
ตอนนี้เรียกใช้ testng.xml เพื่อดูผลลัพธ์ -
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
ตรวจสอบผลลัพธ์
===============================================
Suite1
Total tests run: 1, Failures: 0, Skips: 0
===============================================
การเขียนแบบทดสอบใน TestNG โดยทั่วไปเกี่ยวข้องกับขั้นตอนต่อไปนี้ -
เขียนตรรกะทางธุรกิจของการทดสอบของคุณและใส่คำอธิบายประกอบ TestNG ในโค้ดของคุณ
เพิ่มข้อมูลเกี่ยวกับการทดสอบของคุณ (เช่นชื่อคลาสกลุ่มที่คุณต้องการเรียกใช้ ฯลฯ ) ในไฟล์ testng.xml หรือใน build.xml
เรียกใช้ TestNG
ที่นี่เราจะเห็นตัวอย่างที่สมบูรณ์ของการทดสอบ TestNG โดยใช้คลาส POJO คลาสตรรกะทางธุรกิจและ xml การทดสอบซึ่งจะดำเนินการโดย TestNG
สร้าง EmployeeDetails.java ใน C:\>TestNG_WORKSPACEซึ่งเป็นคลาส POJO
public class EmployeeDetails {
private String name;
private double monthlySalary;
private int age;
// @return the name
public String getName() {
return name;
}
// @param name the name to set
public void setName(String name) {
this.name = name;
}
// @return the monthlySalary
public double getMonthlySalary() {
return monthlySalary;
}
// @param monthlySalary the monthlySalary to set
public void setMonthlySalary(double monthlySalary) {
this.monthlySalary = monthlySalary;
}
// @return the age
public int getAge() {
return age;
}
// @param age the age to set
public void setAge(int age) {
this.age = age;
}
}
EmployeeDetails คลาสใช้เพื่อ -
- รับ / กำหนดมูลค่าของชื่อพนักงาน
- รับ / กำหนดมูลค่าเงินเดือนของพนักงานทุกเดือน
- รับ / กำหนดมูลค่าตามอายุของพนักงาน
สร้างไฟล์ EmpBusinessLogic.java ใน C:\>TestNG_WORKSPACEซึ่งประกอบด้วยตรรกะทางธุรกิจ
public class EmpBusinessLogic {
// Calculate the yearly salary of employee
public double calculateYearlySalary(EmployeeDetails employeeDetails) {
double yearlySalary = 0;
yearlySalary = employeeDetails.getMonthlySalary() * 12;
return yearlySalary;
}
// Calculate the appraisal amount of employee
public double calculateAppraisal(EmployeeDetails employeeDetails) {
double appraisal = 0;
if(employeeDetails.getMonthlySalary() < 10000) {
appraisal = 500;
} else {
appraisal = 1000;
}
return appraisal;
}
}
EmpBusinessLogic คลาสใช้สำหรับคำนวณ -
- เงินเดือนประจำปีของพนักงาน
- จำนวนเงินประเมินของพนักงาน
ตอนนี้เรามาสร้างคลาส TestNG ที่เรียกว่า TestEmployeeDetails.javaใน C: \> TestNG_WORKSPACE คลาส TestNG เป็นคลาส Java ที่มีคำอธิบายประกอบ TestNG อย่างน้อยหนึ่งรายการ คลาสนี้ประกอบด้วยกรณีทดสอบที่จะทดสอบ การทดสอบ TestNG สามารถกำหนดค่าได้ด้วยคำอธิบายประกอบ @BeforeXXX และ @AfterXXX (เราจะเห็นสิ่งนี้ในบทTestNG - ขั้นตอนการดำเนินการ ) ซึ่งอนุญาตให้ดำเนินการตรรกะ Java ก่อนและหลังจุดหนึ่ง
import org.testng.Assert;
import org.testng.annotations.Test;
public class TestEmployeeDetails {
EmpBusinessLogic empBusinessLogic = new EmpBusinessLogic();
EmployeeDetails employee = new EmployeeDetails();
@Test
public void testCalculateAppriasal() {
employee.setName("Rajeev");
employee.setAge(25);
employee.setMonthlySalary(8000);
double appraisal = empBusinessLogic.calculateAppraisal(employee);
Assert.assertEquals(500, appraisal, 0.0, "500");
}
// Test to check yearly salary
@Test
public void testCalculateYearlySalary() {
employee.setName("Rajeev");
employee.setAge(25);
employee.setMonthlySalary(8000);
double salary = empBusinessLogic.calculateYearlySalary(employee);
Assert.assertEquals(96000, salary, 0.0, "8000");
}
}
TestEmployeeDetails คลาสใช้สำหรับทดสอบวิธีการของ EmpBusinessLogicชั้นเรียน. มันทำสิ่งต่อไปนี้ -
ทดสอบเงินเดือนประจำปีของพนักงาน
ทดสอบจำนวนเงินประเมินของพนักงาน
ก่อนที่คุณจะสามารถเรียกใช้การทดสอบคุณต้องกำหนดค่า TestNG โดยใช้ไฟล์ XML พิเศษชื่อ testng.xml ตามอัตภาพ ไวยากรณ์สำหรับไฟล์นี้ง่ายมากและมีเนื้อหาตามที่แสดงด้านล่าง สร้างไฟล์นี้ในC:\>TestNG_WORKSPACE.
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<classes>
<class name = "TestEmployeeDetails"/>
</classes>
</test>
</suite>
รายละเอียดของไฟล์ด้านบนมีดังนี้ -
ชุดจะแสดงโดยไฟล์ XML หนึ่งไฟล์ สามารถมีการทดสอบตั้งแต่หนึ่งรายการขึ้นไปและกำหนดโดยแท็ก <suite>
แท็ก <ทดสอบ> แสดงถึงการทดสอบหนึ่งรายการและสามารถมีคลาส TestNG ได้มากกว่าหนึ่งคลาส
แท็ก <class> แสดงถึงคลาส TestNG เป็นคลาส Java ที่มีคำอธิบายประกอบ TestNG อย่างน้อยหนึ่งรายการ สามารถมีวิธีการทดสอบอย่างน้อยหนึ่งวิธี
รวบรวมคลาสกรณีทดสอบโดยใช้ javac
C:\TestNG_WORKSPACE>javac EmployeeDetails.java EmpBusinessLogic.java TestEmployeeDetails.java
ตอนนี้ TestNG ด้วยคำสั่งต่อไปนี้ -
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
หากทำทุกอย่างถูกต้องคุณจะเห็นผลการทดสอบของคุณในคอนโซล นอกจากนี้ TestNG ยังสร้างรายงาน HTML ที่ดีมากในโฟลเดอร์ที่เรียกว่าtest-outputที่สร้างขึ้นโดยอัตโนมัติในไดเร็กทอรีปัจจุบัน หากคุณเปิดและโหลด index.html คุณจะเห็นหน้าที่คล้ายกับหน้าในภาพด้านล่าง -
วิธีดั้งเดิมในการระบุวิธีทดสอบใน JUnit 3 คือการใส่คำนำหน้าชื่อด้วยการทดสอบ นี่เป็นวิธีการที่มีประสิทธิภาพมากสำหรับการแท็กเมธอดบางอย่างในคลาสเนื่องจากมีความหมายพิเศษ แต่การตั้งชื่อไม่ได้ปรับขนาดได้ดีนัก (ถ้าเราต้องการเพิ่มแท็กเพิ่มเติมสำหรับเฟรมเวิร์กที่แตกต่างกันล่ะ?) และค่อนข้างยืดหยุ่น (ถ้าเรา ต้องการส่งผ่านพารามิเตอร์เพิ่มเติมไปยังกรอบการทดสอบหรือไม่)
คำอธิบายประกอบถูกเพิ่มอย่างเป็นทางการในภาษา Java ใน JDK 5 และ TestNG ได้เลือกใช้คำอธิบายประกอบเพื่อใส่คำอธิบายประกอบคลาสทดสอบ
นี่คือรายการคำอธิบายประกอบที่ TestNG รองรับ -
ซีเนียร์ | คำอธิบายประกอบและคำอธิบาย |
---|---|
1 | @BeforeSuite วิธีการใส่คำอธิบายประกอบจะทำงานเพียงครั้งเดียวก่อนที่การทดสอบทั้งหมดในชุดนี้จะทำงาน |
2 | @AfterSuite วิธีการใส่คำอธิบายประกอบจะทำงานเพียงครั้งเดียวหลังจากการทดสอบทั้งหมดในชุดนี้ทำงานแล้ว |
3 | @BeforeClass วิธีการใส่คำอธิบายประกอบจะถูกเรียกใช้เพียงครั้งเดียวก่อนที่จะเรียกใช้วิธีการทดสอบแรกในคลาสปัจจุบัน |
4 | @AfterClass วิธีการใส่คำอธิบายประกอบจะถูกเรียกใช้เพียงครั้งเดียวหลังจากที่รันวิธีการทดสอบทั้งหมดในคลาสปัจจุบันแล้ว |
5 | @BeforeTest วิธีการใส่คำอธิบายประกอบจะถูกเรียกใช้ก่อนที่วิธีการทดสอบใด ๆ ที่เป็นของคลาสภายในแท็ก <test> จะถูกเรียกใช้ |
6 | @AfterTest วิธีการใส่คำอธิบายประกอบจะถูกเรียกใช้หลังจากวิธีการทดสอบทั้งหมดที่เป็นของคลาสภายในแท็ก <test> ได้ทำงานแล้ว |
7 | @BeforeGroups รายชื่อกลุ่มที่วิธีการกำหนดค่านี้จะทำงานก่อน วิธีนี้รับประกันว่าจะทำงานในไม่ช้าก่อนที่จะมีการเรียกใช้วิธีทดสอบแรกที่เป็นของกลุ่มใด ๆ เหล่านี้ |
8 | @AfterGroups รายชื่อกลุ่มที่วิธีการกำหนดค่านี้จะทำงานหลังจากนั้น วิธีนี้รับประกันว่าจะทำงานในไม่ช้าหลังจากมีการเรียกใช้วิธีการทดสอบล่าสุดที่เป็นของกลุ่มใด ๆ เหล่านี้ |
9 | @BeforeMethod วิธีการใส่คำอธิบายประกอบจะถูกเรียกใช้ก่อนวิธีการทดสอบแต่ละวิธี |
10 | @AfterMethod วิธีการใส่คำอธิบายประกอบจะทำงานหลังจากแต่ละวิธีการทดสอบ |
11 | @DataProvider ทำเครื่องหมายวิธีการเป็นการจัดหาข้อมูลสำหรับวิธีการทดสอบ วิธีการใส่คำอธิบายประกอบต้องส่งคืน Object [] [] โดยที่แต่ละ Object [] สามารถกำหนดรายการพารามิเตอร์ของวิธีการทดสอบได้ วิธีการ @Test ที่ต้องการรับข้อมูลจาก DataProvider นี้จำเป็นต้องใช้ชื่อ dataProvider เท่ากับชื่อของคำอธิบายประกอบนี้ |
12 | @Factory
ทำเครื่องหมายวิธีการเป็นโรงงานที่ส่งคืนอ็อบเจ็กต์ที่ TestNG จะใช้เป็นคลาสทดสอบ เมธอดต้องส่งคืน Object [] |
13 | @Listeners กำหนดผู้ฟังในชั้นเรียนทดสอบ |
14 | @Parameters อธิบายวิธีการส่งพารามิเตอร์ไปยังเมธอด @Test |
15 | @Test ทำเครื่องหมายคลาสหรือวิธีการเป็นส่วนหนึ่งของการทดสอบ |
ประโยชน์ของการใช้คำอธิบายประกอบ
ต่อไปนี้เป็นประโยชน์บางประการของการใช้คำอธิบายประกอบ -
TestNG ระบุวิธีการที่สนใจโดยค้นหาคำอธิบายประกอบ ดังนั้นชื่อวิธีการจึงไม่ จำกัด เฉพาะรูปแบบหรือรูปแบบใด ๆ
เราสามารถส่งผ่านพารามิเตอร์เพิ่มเติมไปยังคำอธิบายประกอบ
คำอธิบายประกอบถูกพิมพ์อย่างรุนแรงดังนั้นคอมไพลเลอร์จะตั้งค่าสถานะข้อผิดพลาดทันที
คลาสทดสอบไม่จำเป็นต้องขยายอะไรอีกต่อไป (เช่น TestCase สำหรับ JUnit 3)
บทนี้อธิบายขั้นตอนการดำเนินการของวิธีการใน TestNG จะอธิบายลำดับของวิธีการที่เรียกว่า นี่คือขั้นตอนการดำเนินการของเมธอด TestNG test API พร้อมตัวอย่าง
สร้างชื่อไฟล์คลาส java TestngAnnotation.java ใน C:\>TestNG_WORKSPACE เพื่อทดสอบคำอธิบายประกอบ
import org.testng.annotations.Test;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.AfterSuite;
public class TestngAnnotation {
// test case 1
@Test
public void testCase1() {
System.out.println("in test case 1");
}
// test case 2
@Test
public void testCase2() {
System.out.println("in test case 2");
}
@BeforeMethod
public void beforeMethod() {
System.out.println("in beforeMethod");
}
@AfterMethod
public void afterMethod() {
System.out.println("in afterMethod");
}
@BeforeClass
public void beforeClass() {
System.out.println("in beforeClass");
}
@AfterClass
public void afterClass() {
System.out.println("in afterClass");
}
@BeforeTest
public void beforeTest() {
System.out.println("in beforeTest");
}
@AfterTest
public void afterTest() {
System.out.println("in afterTest");
}
@BeforeSuite
public void beforeSuite() {
System.out.println("in beforeSuite");
}
@AfterSuite
public void afterSuite() {
System.out.println("in afterSuite");
}
}
ต่อไปมาสร้างไฟล์ testng.xml ใน C:\>TestNG_WORKSPACE เพื่อดำเนินการคำอธิบายประกอบ
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<classes>
<class name = "TestngAnnotation"/>
</classes>
</test>
</suite>
คอมไพล์คลาสกรณีทดสอบโดยใช้ javac
C:\TestNG_WORKSPACE>javac TestngAnnotation.java
ตอนนี้เรียกใช้ testng.xml ซึ่งจะเรียกใช้กรณีทดสอบที่กำหนดไว้ในคลาส Test Case ที่ให้มา
C:\TestNG_WORKSPACE>java org.testng.TestNG testng.xml
ตรวจสอบผลลัพธ์
in beforeSuite
in beforeTest
in beforeClass
in beforeMethod
in test case 1
in afterMethod
in beforeMethod
in test case 2
in afterMethod
in afterClass
in afterTest
in afterSuite
===============================================
Suite
Total tests run: 2, Failures: 0, Skips: 0
===============================================
จากผลลัพธ์ข้างต้นขั้นตอนการดำเนินการมีดังนี้ -
ก่อนอื่นเมธอด beforeSuite () จะดำเนินการเพียงครั้งเดียว
สุดท้ายวิธี afterSuite () ดำเนินการเพียงครั้งเดียว
แม้แต่เมธอด beforeTest (), beforeClass (), afterClass () และ afterTest () จะดำเนินการเพียงครั้งเดียว
beforeMethod () วิธีการดำเนินการสำหรับแต่ละกรณีการทดสอบ แต่ก่อนที่จะดำเนินการกรณีทดสอบ
afterMethod () วิธีการดำเนินการสำหรับแต่ละกรณีการทดสอบ แต่หลังจากดำเนินการกรณีทดสอบ
ระหว่าง beforeMethod () และ afterMethod () แต่ละกรณีทดสอบจะดำเนินการ
กรณีทดสอบดำเนินการโดยใช้ TestNGชั้นเรียน. คลาสนี้เป็นจุดเริ่มต้นหลักสำหรับการรันการทดสอบในกรอบงาน TestNG ผู้ใช้สามารถสร้างวัตถุ TestNG ของตนเองและเรียกใช้งานได้หลายวิธีเช่น -
บน testng.xml ที่มีอยู่
บน testng.xml สังเคราะห์ที่สร้างขึ้นจาก Java ทั้งหมด
โดยการตั้งค่าคลาสทดสอบโดยตรง
คุณยังสามารถกำหนดกลุ่มที่จะรวมหรือไม่รวมกำหนดพารามิเตอร์ ฯลฯ พารามิเตอร์บรรทัดคำสั่งคือ -
-d outputdir: ระบุไดเร็กทอรีเอาต์พุต
-testclass class_name: ระบุชื่อคลาสหนึ่งหรือหลายชื่อ
-testjar jar_name: ระบุ jar ที่มีการทดสอบ
-sourcedir src1; src2:; แยกรายการไดเร็กทอรีต้นทาง (ใช้เฉพาะเมื่อใช้คำอธิบายประกอบ javadoc)
-target
-groups
-testrunfactory
-listener
เราจะสร้างออบเจ็กต์ TestNG เป็น testng.xml ที่มีอยู่ในตัวอย่างด้านล่าง
สร้างชั้นเรียน
สร้างคลาส java ที่จะทดสอบพูดว่า MessageUtil.java ใน C:\>TestNG_WORKSPACE.
/*
* This class prints the given message on console.
*/
public class MessageUtil {
private String message;
//Constructor
//@param message to be printed
public MessageUtil(String message) {
this.message = message;
}
// prints the message
public String printMessage() {
System.out.println(message);
return message;
}
}
สร้างคลาสกรณีทดสอบ
สร้างคลาสทดสอบ java พูดว่า SampleTest.java.
เพิ่มวิธีการทดสอบ testPrintMessage () ในคลาสทดสอบของคุณ
เพิ่ม Annotation @Test ลงใน method testPrintMessage ()
ใช้เงื่อนไขการทดสอบและตรวจสอบเงื่อนไขโดยใช้ assertEquals API ของ TestNG
สร้างไฟล์คลาส java ที่เรียกว่า SampleTest.java ใน C:\>TestNG_WORKSPACE.
import org.testng.Assert;
import org.testng.annotations.Test;
public class SampleTest {
String message = "Hello World";
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testPrintMessage() {
Assert.assertEquals(message, messageUtil.printMessage());
}
}
สร้าง testng.xml
ต่อไปมาสร้างไฟล์ testng.xml ใน C:\>TestNG_WORKSPACEเพื่อดำเนินการกรณีทดสอบ ไฟล์นี้รวบรวมการทดสอบทั้งหมดของคุณใน XML ไฟล์นี้ทำให้ง่ายต่อการอธิบายชุดทดสอบและพารามิเตอร์ทั้งหมดของคุณในไฟล์เดียวซึ่งคุณสามารถตรวจสอบในที่เก็บโค้ดของคุณหรือส่งอีเมลถึงเพื่อนร่วมงานได้ นอกจากนี้ยังทำให้ง่ายต่อการแยกชุดย่อยของการทดสอบของคุณหรือแยกการกำหนดค่ารันไทม์หลายรายการ (เช่น testngdatabase.xml จะรันเฉพาะการทดสอบที่ใช้ฐานข้อมูลของคุณ)
<?xml version = "1.0" encoding = "UTF-8"?>
<suite name = "Sample test Suite">
<test name = "Sample test">
<classes>
<class name = "SampleTest" />
</classes>
</test>
</suite>
รวบรวมกรณีทดสอบโดยใช้ javac
C:\TestNG_WORKSPACE>javac MessageUtil.java SampleTest.java
ตอนนี้เรียกใช้ testng.xml ซึ่งจะเรียกใช้กรณีทดสอบที่กำหนดในแท็ก <test>
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
ตรวจสอบผลลัพธ์
Hello World
===============================================
Sample test Suite
Total tests run: 1, Failures: 0, Skips: 0
===============================================
ก test suiteคือชุดกรณีทดสอบที่มีวัตถุประสงค์เพื่อทดสอบพฤติกรรมหรือชุดพฤติกรรมของโปรแกรมซอฟต์แวร์ ใน TestNG เราไม่สามารถกำหนดชุดในการทดสอบซอร์สโค้ดได้ แต่จะแสดงโดยไฟล์ XML เดียวเนื่องจากชุดเป็นคุณลักษณะของการดำเนินการ นอกจากนี้ยังช่วยให้สามารถเรียกใช้การกำหนดค่าการทดสอบได้อย่างยืดหยุ่น ชุดสามารถมีการทดสอบอย่างน้อยหนึ่งรายการและกำหนดโดยแท็ก <suite>
<suite> คือแท็กรากของ testng.xml ของคุณ อธิบายถึงชุดทดสอบซึ่งประกอบด้วยส่วน <ทดสอบ> หลายส่วน
ตารางต่อไปนี้แสดงรายการแอตทริบิวต์ทางกฎหมายทั้งหมดที่ <suite> ยอมรับ
ซีเนียร์ | คุณสมบัติและคำอธิบาย |
---|---|
1 | name ชื่อห้องชุดนี้ มันคือmandatory แอตทริบิวต์ |
2 | verbose ระดับหรือฟุ่มเฟื่อยสำหรับการรันนี้ |
3 | parallel TestNG ควรรันเธรดที่แตกต่างกันเพื่อเรียกใช้ชุดนี้หรือไม่ |
4 | thread-count จำนวนเธรดที่จะใช้หากเปิดใช้งานโหมดขนาน (ละเว้นอื่น ๆ ที่ชาญฉลาด) |
5 | annotations ประเภทของคำอธิบายประกอบที่คุณใช้ในการทดสอบ |
6 | time-out การหมดเวลาเริ่มต้นที่จะใช้กับวิธีการทดสอบทั้งหมดที่พบในการทดสอบนี้ |
ในบทนี้เราจะแสดงตัวอย่างที่มีคลาสทดสอบสองคลาสคือ Test1 และ Test2 เพื่อรันร่วมกันโดยใช้ Test Suite
สร้างชั้นเรียน
สร้างคลาส java ที่จะทดสอบพูดว่า MessageUtil.java ใน C:\>JUNIT_WORKSPACE.
/*
* This class prints the given message on console.
*/
public class MessageUtil {
private String message;
// Constructor
// @param message to be printed
public MessageUtil(String message) {
this.message = message;
}
// prints the message
public String printMessage() {
System.out.println(message);
return message;
}
// add "Hi!" to the message
public String salutationMessage() {
message = "Hi!" + message;
System.out.println(message);
return message;
}
}
สร้างคลาสกรณีทดสอบ
สร้างไฟล์คลาส java ชื่อ Test1.java ใน C:\>TestNG_WORKSPACE.
import org.testng.Assert;
import org.testng.annotations.Test;
public class Test1 {
String message = "Manisha";
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testPrintMessage() {
System.out.println("Inside testPrintMessage()");
Assert.assertEquals(message, messageUtil.printMessage());
}
}
สร้างไฟล์คลาส java ชื่อ Test2.java ใน C:\>TestNG_WORKSPACE.
import org.testng.Assert;
import org.testng.annotations.Test;
public class Test2 {
String message = "Manisha";
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testSalutationMessage() {
System.out.println("Inside testSalutationMessage()");
message = "Hi!" + "Manisha";
Assert.assertEquals(message,messageUtil.salutationMessage());
}
}
ตอนนี้ขอเขียน testng.xml ใน C:\>TestNG_WORKSPACEซึ่งจะมีแท็ก <suite> ดังนี้ -
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "exampletest1">
<classes>
<class name = "Test1" />
</classes>
</test>
<test name = "exampletest2">
<classes>
<class name = "Test2" />
</classes>
</test>
</suite>
Suite1 ประกอบด้วย exampletest1 และ exampletest2.
รวบรวมคลาส java ทั้งหมดโดยใช้ javac
C:\TestNG_WORKSPACE>javac MessageUtil.java Test1.java Test2.java
ตอนนี้เรียกใช้ testng.xml ซึ่งจะเรียกใช้กรณีทดสอบที่กำหนดไว้ในคลาส Test Case ที่ให้มา
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
ตรวจสอบผลลัพธ์
Inside testPrintMessage()
Manisha
Inside testSalutationMessage()
Hi!Manisha
===============================================
Suite1
Total tests run: 2, Failures: 0, Skips: 0
===============================================
คุณยังสามารถตรวจสอบโฟลเดอร์ผลลัพธ์การทดสอบ ภายใต้โฟลเดอร์Suite1คุณจะเห็นไฟล์ html สองไฟล์ที่สร้างขึ้น exampletest1.html และ exampletest2.html ซึ่งจะมีลักษณะดังนี้ -
บางครั้งมันเกิดขึ้นว่าโค้ดของเราไม่พร้อมและกรณีทดสอบที่เขียนขึ้นเพื่อทดสอบเมธอด / โค้ดนั้นล้มเหลว ในกรณีเช่นนี้คำอธิบายประกอบ@Test(enabled = false) ช่วยปิดการใช้งานกรณีทดสอบนี้
หากวิธีการทดสอบมีคำอธิบายประกอบด้วย@Test (เปิดใช้งาน = เท็จ)กรณีทดสอบที่ยังไม่พร้อมทดสอบจะถูกข้าม
ตอนนี้เรามาดูการทำงานของ @Test (enable = false)
สร้างชั้นเรียน
สร้างคลาส java ที่จะทดสอบพูดว่า MessageUtil.java ใน C:\>TestNG_WORKSPACE.
/*
* This class prints the given message on console.
*/
public class MessageUtil {
private String message;
//Constructor
//@param message to be printed
public MessageUtil(String message) {
this.message = message;
}
// prints the message
public String printMessage() {
System.out.println(message);
return message;
}
// add "Hi!" to the message
public String salutationMessage() {
message = "Hi!" + message;
System.out.println(message);
return message;
}
}
สร้างคลาสกรณีทดสอบ
สร้างคลาสทดสอบ java พูดว่า IgnoreTest.java.
เพิ่มวิธีการทดสอบ testPrintMessage () และ testSalutationMessage () ลงในคลาสทดสอบของคุณ
เพิ่ม Annotation @Test (enable = false) ลงใน method testPrintMessage ()
สร้างไฟล์คลาส java ชื่อ IgnoreTest.java ใน C:\>TestNG_WORKSPACE.
import org.testng.Assert;
import org.testng.annotations.Test;
public class IgnoreTest {
String message = "Manisha";
MessageUtil messageUtil = new MessageUtil(message);
@Test(enabled = false)
public void testPrintMessage() {
System.out.println("Inside testPrintMessage()");
message = "Manisha";
Assert.assertEquals(message, messageUtil.printMessage());
}
@Test
public void testSalutationMessage() {
System.out.println("Inside testSalutationMessage()");
message = "Hi!" + "Manisha";
Assert.assertEquals(message, messageUtil.salutationMessage());
}
}
สร้าง testng.xml
สร้าง testng.xml ใน C:\>TestNG_WORKSPACE เพื่อดำเนินการกรณีทดสอบ
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<classes>
<class name = "IgnoreTest" />
</classes>
</test>
</suite>
คอมไพล์ MessageUtil และคลาสเคสทดสอบโดยใช้ javac
C:\TestNG_WORKSPACE>javac MessageUtil.java IgnoreTest.java
ตอนนี้ให้รัน testng.xml ซึ่งจะไม่เรียกใช้ testPrintMessage () กรณีทดสอบที่กำหนดไว้ในคลาส Test Case
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
ตรวจสอบผลลัพธ์ testPrintMessage () ไม่ได้ทดสอบกรณีทดสอบ
Inside testSalutationMessage()
Hi!Manisha
===============================================
Suite1
Total tests run: 1, Failures: 0, Skips: 0
===============================================
คุณยังสามารถเพิกเฉยต่อกลุ่มการทดสอบซึ่งจะกล่าวถึงในบทถัดไป
การทดสอบกลุ่มเป็นคุณสมบัติใหม่ใน TestNG ซึ่งไม่มีอยู่ในกรอบงาน JUnit อนุญาตให้คุณจัดส่งวิธีการไปยังส่วนที่เหมาะสมและดำเนินการจัดกลุ่มวิธีการทดสอบที่ซับซ้อน
คุณไม่เพียง แต่สามารถประกาศวิธีการเหล่านั้นที่เป็นของกลุ่มเท่านั้น แต่คุณยังสามารถระบุกลุ่มที่มีกลุ่มอื่น ๆ จากนั้นสามารถเรียกใช้ TestNG และขอให้รวมกลุ่มบางกลุ่ม (หรือนิพจน์ทั่วไป) ในขณะที่ไม่รวมชุดอื่น
การทดสอบกลุ่มให้ความยืดหยุ่นสูงสุดในการแบ่งพาร์ติชันการทดสอบของคุณและไม่จำเป็นต้องให้คุณทำการคอมไพล์ใหม่หากคุณต้องการเรียกใช้ชุดการทดสอบที่แตกต่างกันสองชุดกลับไปด้านหลัง
มีการระบุกลุ่มในไฟล์ testng.xml ของคุณโดยใช้แท็ก <groups> สามารถพบได้ในแท็ก <test> หรือ <suite> กลุ่มที่ระบุในแท็ก <suite> ใช้กับแท็ก <test> ทั้งหมดที่อยู่ด้านล่าง
ตอนนี้เรามาดูตัวอย่างเพื่อดูว่าการทดสอบกลุ่มทำงานอย่างไร
สร้างชั้นเรียน
สร้างคลาส java ที่จะทดสอบพูดว่า MessageUtil.java ใน C:\> TestNG_WORKSPACE.
/*
* This class prints the given message on console.
*/
public class MessageUtil {
private String message;
// Constructor
// @param message to be printed
public MessageUtil(String message) {
this.message = message;
}
// prints the message
public String printMessage() {
System.out.println(message);
return message;
}
// add "tutorialspoint" to the message
public String salutationMessage() {
message = "tutorialspoint" + message;
System.out.println(message);
return message;
}
// add "www." to the message
public String exitMessage() {
message = "www." + message;
System.out.println(message);
return message;
}
}
สร้างคลาสกรณีทดสอบ
สร้างคลาสทดสอบ java เช่น GroupTestExample.java
เพิ่มวิธีการทดสอบ testPrintMessage () และ testSalutationMessage () ลงในคลาสทดสอบของคุณ
จัดกลุ่มวิธีการทดสอบเป็นสองประเภท -
Check-in tests (checkintest)- ควรดำเนินการทดสอบเหล่านี้ก่อนที่คุณจะส่งรหัสใหม่ โดยทั่วไปควรจะเร็วและตรวจสอบให้แน่ใจว่าไม่มีฟังก์ชันพื้นฐานใดเสียหาย
Functional tests (functest) - การทดสอบเหล่านี้ควรครอบคลุมฟังก์ชันการทำงานทั้งหมดของซอฟต์แวร์ของคุณและเปิดใช้งานอย่างน้อยวันละครั้งแม้ว่าคุณจะต้องการเรียกใช้อย่างต่อเนื่องก็ตาม
สร้างไฟล์คลาส java ชื่อ GroupTestExample.java ใน C:\>TestNG_WORKSPACE.
import org.testng.Assert;
import org.testng.annotations.Test;
public class GroupTestExample {
String message = ".com";
MessageUtil messageUtil = new MessageUtil(message);
@Test(groups = { "functest", "checkintest" })
public void testPrintMessage() {
System.out.println("Inside testPrintMessage()");
message = ".com";
Assert.assertEquals(message, messageUtil.printMessage());
}
@Test(groups = { "checkintest" })
public void testSalutationMessage() {
System.out.println("Inside testSalutationMessage()");
message = "tutorialspoint" + ".com";
Assert.assertEquals(message, messageUtil.salutationMessage());
}
@Test(groups = { "functest" })
public void testingExitMessage() {
System.out.println("Inside testExitMessage()");
message = "www." + "tutorialspoint"+".com";
Assert.assertEquals(message, messageUtil.exitMessage());
}
}
สร้าง testng.xml
สร้าง testng.xml ใน C:\> TestNG_WORKSPACEเพื่อดำเนินการกรณีทดสอบ ที่นี่เราจะได้รับการดำเนินการเพียงการทดสอบเหล่านั้นที่อยู่ในกลุ่มfunctest
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<groups>
<run>
<include name = "functest" />
</run>
</groups>
<classes>
<class name = "GroupTestExample" />
</classes>
</test>
</suite>
คอมไพล์ MessageUtil คลาสเคสทดสอบโดยใช้ javac
C:\TestNG_WORKSPACE>javac MessageUtil.java GroupTestExample.java
ตอนนี้ทำงาน testng.xml ซึ่งจะทำงานเฉพาะวิธี testPrintMessage () ในขณะที่มันอยู่ในกลุ่มfunctest
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
ตรวจสอบผลลัพธ์ ดำเนินการเฉพาะเมธอด testPrintMessage () เท่านั้น
Inside testPrintMessage()
.com
Inside testExitMessage()
www..com
===============================================
Suite1
Total tests run: 2, Failures: 1, Skips: 0
===============================================
กลุ่มของกลุ่ม
กลุ่มยังสามารถรวมกลุ่มอื่น ๆ กลุ่มเหล่านี้เรียกว่าMetaGroups. ตัวอย่างเช่นคุณอาจต้องการที่จะกำหนดกลุ่มทั้งหมดที่มีcheckintestและfunctest มาแก้ไขไฟล์ testng.xml ของเราดังนี้ -
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<groups>
<define name = "all">
<include name = "functest"/>
<include name = "checkintest"/>
</define>
<run>
<include name = "all"/>
</run>
</groups>
<classes>
<class name = "GroupTestExample" />
</classes>
</test>
</suite>
การดำเนินการ testng.xml ข้างต้นจะดำเนินการทดสอบทั้งสามและจะให้ผลลัพธ์ดังต่อไปนี้ -
Inside testPrintMessage()
.com
Inside testSalutationMessage()
tutorialspoint.com
Inside testExitMessage()
www.tutorialspoint.com
===============================================
Suite1
Total tests run: 3, Failures: 0, Skips: 0
===============================================
กลุ่มการยกเว้น
คุณสามารถละเว้นกลุ่มโดยใช้แท็ก <exclude> ดังที่แสดงด้านล่าง -
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<groups>
<define name = "all">
<exclude name = "functest"/>
<include name = "checkintest"/>
</define>
<run>
<include name = "all"/>
</run>
</groups>
<classes>
<class name = "GroupTestExample" />
</classes>
</test>
</suite>
TestNG มีตัวเลือกในการติดตามการจัดการข้อยกเว้นของโค้ด คุณสามารถทดสอบว่ารหัสส่งข้อยกเว้นที่ต้องการหรือไม่ ที่นี่expectedExceptionsพารามิเตอร์ถูกใช้ร่วมกับคำอธิบายประกอบ @Test ตอนนี้เรามาดูกัน@Test(expectedExceptions) ในการดำเนินการ
สร้างชั้นเรียน
สร้างคลาส java ที่จะทดสอบพูดว่า MessageUtil.java ใน C:\> TestNG_WORKSPACE. เพิ่มเงื่อนไขข้อผิดพลาดภายในเมธอด printMessage ()
/*
* This class prints the given message on console.
*/
public class MessageUtil {
private String message;
//Constructor
//@param message to be printed
public MessageUtil(String message) {
this.message = message;
}
// prints the message
public void printMessage() {
System.out.println(message);
int a =0;
int b = 1/a;
}
// add "Hi!" to the message
public String salutationMessage() {
message = "Hi!" + message;
System.out.println(message);
return message;
}
}
สร้างคลาสกรณีทดสอบ
สร้างคลาสทดสอบ java พูดว่า ExpectedExceptionTest.java.
เพิ่มข้อยกเว้น ArithmeticException ที่คาดไว้ในกรณีทดสอบ testPrintMessage ()
สร้างไฟล์คลาส java ชื่อ ExpectedExceptionTest.java ใน C:\> TestNG_WORKSPACE.
import org.testng.Assert;
import org.testng.annotations.Test;
public class ExpectedExceptionTest {
String message = "Manisha";
MessageUtil messageUtil = new MessageUtil(message);
@Test(expectedExceptions = ArithmeticException.class)
public void testPrintMessage() {
System.out.println("Inside testPrintMessage()");
messageUtil.printMessage();
}
@Test
public void testSalutationMessage() {
System.out.println("Inside testSalutationMessage()");
message = "Hi!" + "Manisha";
Assert.assertEquals(message,messageUtil.salutationMessage());
}
}
สร้าง Test Runner
สร้าง testng.xml ใน C:\>TestNG_WORKSPACE เพื่อดำเนินการกรณีทดสอบ
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<classes>
<class name = "ExpectedExceptionTest" />
</classes>
</test>
</suite>
คอมไพล์ MessageUtil คลาสเคสทดสอบโดยใช้ javac
C:\TestNG_WORKSPACE>javac MessageUtil.java TestJunit.java
ตอนนี้เรียกใช้ Test Runner ซึ่งจะเรียกใช้กรณีทดสอบที่กำหนดไว้ในคลาส Test Case ที่ให้มา
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
ตรวจสอบผลลัพธ์ testPrintMessage () กรณีทดสอบจะถูกส่งผ่าน
Inside testPrintMessage()
Manisha
Inside testSalutationMessage()
Hi!Manisha
===============================================
Suite1
Total tests run: 2, Failures: 0, Skips: 0
===============================================
บางครั้งคุณอาจต้องเรียกใช้วิธีการในกรณีทดสอบตามลำดับที่เจาะจงหรือคุณอาจต้องการแบ่งปันข้อมูลและสถานะระหว่างวิธีการ TestNG สนับสนุนการพึ่งพาประเภทนี้เนื่องจากสนับสนุนการประกาศการอ้างอิงอย่างชัดเจนระหว่างวิธีการทดสอบ
TestNG ช่วยให้คุณระบุการอ้างอิงด้วย -
การใช้แอตทริบิวต์ขึ้นอยู่กับวิธีการในคำอธิบายประกอบ @Test หรือ
การใช้แอตทริบิวต์ขึ้นอยู่บนกลุ่มในคำอธิบายประกอบ @Test
ตัวอย่างการใช้ขึ้นอยู่กับวิธีการ
สร้างชั้นเรียน
สร้างคลาส java ที่จะทดสอบพูดว่า MessageUtil.java ใน C:\>TestNG_WORKSPACE.
public class MessageUtil {
private String message;
// Constructor
// @param message to be printed
public MessageUtil(String message) {
this.message = message;
}
// prints the message
public String printMessage() {
System.out.println(message);
return message;
}
// add "Hi!" to the message
public String salutationMessage() {
message = "Hi!" + message;
System.out.println(message);
return message;
}
}
สร้างคลาสกรณีทดสอบ
สร้างคลาสทดสอบ java พูด DependencyTestUsingAnnotation.java
เพิ่มวิธีการทดสอบ testPrintMessage () และ testSalutationMessage () และ initEnvironmentTest () ไปยังคลาสทดสอบของคุณ
เพิ่มแอตทริบิวต์ dependsOnMethods = {"initEnvironmentTest"} ไปยังคำอธิบายประกอบ @Test ของ testSalutationMessage() วิธี.
สร้างชื่อไฟล์คลาส java DependencyTestUsingAnnotation.java ใน C:\>TestNG_WORKSPACE.
import org.testng.Assert;
import org.testng.annotations.Test;
public class DependencyTestUsingAnnotation {
String message = "Manisha";
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testPrintMessage() {
System.out.println("Inside testPrintMessage()");
message = "Manisha";
Assert.assertEquals(message, messageUtil.printMessage());
}
@Test(dependsOnMethods = { "initEnvironmentTest" })
public void testSalutationMessage() {
System.out.println("Inside testSalutationMessage()");
message = "Hi!" + "Manisha";
Assert.assertEquals(message, messageUtil.salutationMessage());
}
@Test
public void initEnvironmentTest() {
System.out.println("This is initEnvironmentTest");
}
}
สร้าง testng.xml
สร้าง testng.xml ใน C:\>TestNG_WORKSPACE เพื่อดำเนินการกรณีทดสอบ
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<classes>
<class name = "DependencyTestUsingAnnotation" />
</classes>
</test>
</suite>
คอมไพล์ MessageUtil คลาสเคสทดสอบโดยใช้ javac
C:\TestNG_WORKSPACE>javac MessageUtil.java DependencyTestUsingAnnotation.java
ตอนนี้เรียกใช้ testng.xml ซึ่งจะรันเมธอด testSalutationMessage () หลังจากการดำเนินการของเมธอด initEnvironmentTest () เท่านั้น
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
ตรวจสอบผลลัพธ์
This is initEnvironmentTest
Inside testPrintMessage()
Manisha
Inside testSalutationMessage()
Hi!Manisha
===============================================
Suite1
Total tests run: 3, Failures: 0, Skips: 0
===============================================
ตัวอย่างการใช้ขึ้นอยู่กับกลุ่ม
คุณยังสามารถมีวิธีการที่ขึ้นอยู่กับทั้งกลุ่ม ลองมีตัวอย่างเพื่อสาธิตสิ่งนี้
สร้างชั้นเรียน
สร้างคลาส java ที่จะทดสอบพูดว่า MessageUtil.java ใน C:\>TestNG_WORKSPACE.
public class MessageUtil {
private String message;
// Constructor
// @param message to be printed
public MessageUtil(String message) {
this.message = message;
}
// prints the message
public String printMessage() {
System.out.println(message);
return message;
}
// add "Hi!" to the message
public String salutationMessage() {
message = "Hi!" + message;
System.out.println(message);
return message;
}
}
สร้างคลาสกรณีทดสอบ
สร้างคลาสทดสอบ java พูด DependencyTestUsingAnnotation.java
เพิ่มวิธีการทดสอบ testPrintMessage () testSalutationMessage () และ initEnvironmentTest () ในคลาสทดสอบของคุณและเพิ่มลงในกลุ่ม "init"
เพิ่มแอตทริบิวต์ dependsOnMethods = {"init.*"} ไปยังคำอธิบายประกอบ @Test ของ testSalutationMessage() วิธี.
สร้างไฟล์คลาส java ชื่อ DependencyTestUsingAnnotation.java ใน C:\>TestNG_WORKSPACE.
import org.testng.Assert;
import org.testng.annotations.Test;
public class DependencyTestUsingAnnotation {
String message = "Manisha";
MessageUtil messageUtil = new MessageUtil(message);
@Test(groups = { "init" })
public void testPrintMessage() {
System.out.println("Inside testPrintMessage()");
message = "Manisha";
Assert.assertEquals(message, messageUtil.printMessage());
}
@Test(dependsOnGroups = { "init.*" })
public void testSalutationMessage() {
System.out.println("Inside testSalutationMessage()");
message = "Hi!" + "Manisha";
Assert.assertEquals(message, messageUtil.salutationMessage());
}
@Test(groups = { "init" })
public void initEnvironmentTest() {
System.out.println("This is initEnvironmentTest");
}
}
ในตัวอย่างนี้ testSalutationMessage () ถูกประกาศว่าขึ้นอยู่กับกลุ่มใด ๆ ซึ่งตรงกับนิพจน์ทั่วไป "init. *" ซึ่งรับประกันว่าวิธีการ testPrintMessage () และ initEnvironmentTest () จะถูกเรียกก่อน testSalutationMessage () เสมอ
หากวิธีการขึ้นอยู่กับความล้มเหลวและคุณมีการพึ่งพาอย่างหนัก (alwaysRun = false ซึ่งเป็นค่าดีฟอลต์) เมธอดที่ขึ้นอยู่กับวิธีนั้นจะไม่ถูกทำเครื่องหมายว่า FAIL แต่เป็น SKIP วิธีการข้ามจะได้รับการรายงานในรายงานฉบับสุดท้าย (เป็นสีที่ไม่ใช่สีแดงหรือสีเขียวใน HTML) ซึ่งมีความสำคัญเนื่องจากวิธีการข้ามไม่จำเป็นต้องล้มเหลว
สร้าง testng.xml
สร้าง testng.xml ใน C:\>TestNG_WORKSPACE เพื่อดำเนินการกรณีทดสอบ
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<classes>
<class name = "DependencyTestUsingAnnotation" />
</classes>
</test>
</suite>
คอมไพล์ MessageUtil คลาสเคสทดสอบโดยใช้ javac
C:\TestNG_WORKSPACE>javac MessageUtil.java DependencyTestUsingAnnotation.java
ตอนนี้เรียกใช้ testng.xml ซึ่งจะรันเมธอด testSalutationMessage ()หลังจากการดำเนินการของเมธอด initEnvironmentTest ()เท่านั้น
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
ตรวจสอบผลลัพธ์
This is initEnvironmentTest
Inside testPrintMessage()
Manisha
Inside testSalutationMessage()
Hi!Manisha
===============================================
Suite1
Total tests run: 3, Failures: 0, Skips: 0
===============================================
upOnGroups Vs ขึ้นอยู่กับOnMethods
ในการใช้กลุ่มเราจะไม่พบปัญหาการปรับโครงสร้างอีกต่อไป ตราบเท่าที่เราไม่แก้ไขแอตทริบิวต์ dependOnGroups หรือกลุ่มการทดสอบของเราจะยังคงทำงานต่อไปพร้อมกับการตั้งค่าการอ้างอิงที่เหมาะสม
เมื่อใดก็ตามที่ต้องเพิ่มวิธีการใหม่ในกราฟการอ้างอิงสิ่งที่เราต้องทำคือวางไว้ในกลุ่มที่ถูกต้องและตรวจสอบให้แน่ใจว่าขึ้นอยู่กับกลุ่มที่ถูกต้อง เราไม่จำเป็นต้องแก้ไขวิธีการอื่นใด
คุณสมบัติที่น่าสนใจอีกอย่างที่มีอยู่ใน TestNG คือ parametric testing. ในกรณีส่วนใหญ่คุณจะเจอสถานการณ์ที่ตรรกะทางธุรกิจต้องใช้การทดสอบที่แตกต่างกันอย่างมากParameterized tests อนุญาตให้นักพัฒนาทำการทดสอบเดิมซ้ำแล้วซ้ำเล่าโดยใช้ค่าที่ต่างกัน
TestNG ช่วยให้คุณส่งผ่านพารามิเตอร์ไปยังวิธีการทดสอบของคุณได้โดยตรงสองวิธี -
- ด้วย testng.xml
- กับผู้ให้บริการข้อมูล
การส่งผ่านพารามิเตอร์ด้วยtestng.xml
ด้วยเทคนิคนี้คุณกำหนดพารามิเตอร์อย่างง่ายในไฟล์testng.xmlจากนั้นอ้างอิงพารามิเตอร์เหล่านั้นในไฟล์ต้นฉบับ ให้เรามีตัวอย่างเพื่อสาธิตวิธีการใช้เทคนิคนี้เพื่อส่งผ่านพารามิเตอร์
สร้างคลาสกรณีทดสอบ
สร้างคลาสทดสอบ java กล่าวว่า ParameterizedTest1.java
เพิ่มวิธีการทดสอบ parameterTest () ในคลาสทดสอบของคุณ วิธีนี้ใช้สตริงเป็นพารามิเตอร์อินพุต
เพิ่มคำอธิบายประกอบ@Parameters ("myName")ลงในวิธีนี้ พารามิเตอร์จะถูกส่งผ่านค่าจาก testng.xml ซึ่งเราจะเห็นในขั้นตอนต่อไป
สร้างไฟล์คลาส java ชื่อ ParameterizedTest1.java ใน C:\>TestNG_WORKSPACE.
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
public class ParameterizedTest1 {
@Test
@Parameters("myName")
public void parameterTest(String myName) {
System.out.println("Parameterized value is : " + myName);
}
}
สร้าง testng.xml
สร้าง testng.xml ใน C:\>TestNG_WORKSPACE เพื่อดำเนินการกรณีทดสอบ
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<parameter name = "myName" value="manisha"/>
<classes>
<class name = "ParameterizedTest1" />
</classes>
</test>
</suite>
เรายังสามารถกำหนดพารามิเตอร์ในระดับ <suite> สมมติว่าเราได้กำหนดmyNameทั้งในระดับ <suite> และ <test> ในกรณีเช่นนี้จะใช้กฎการกำหนดขอบเขตปกติ หมายความว่าคลาสใด ๆ ในแท็ก <test> จะเห็นค่าของพารามิเตอร์ที่กำหนดใน <test> ในขณะที่คลาสในไฟล์ testng.xml ที่เหลือจะเห็นค่าที่กำหนดใน <suite>
รวบรวมคลาสกรณีทดสอบโดยใช้ javac
C:\TestNG_WORKSPACE>javac ParameterizedTest1.java
ตอนนี้เรียกใช้ testng.xml ซึ่งจะเรียกใช้เมธอดparameterTest TestNG จะพยายามค้นหาพารามิเตอร์ชื่อmyNameก่อนในแท็ก <ทดสอบ> จากนั้นหากไม่พบก็จะค้นหาในแท็ก <suit> ที่ล้อมรอบไว้
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
ตรวจสอบผลลัพธ์
Parameterized value is : manisha
===============================================
Suite1
Total tests run: 1, Failures: 0, Skips: 0
===============================================
TestNG จะพยายามแปลงค่าที่ระบุใน testng.xml เป็นประเภทพารามิเตอร์ของคุณโดยอัตโนมัติ ประเภทที่รองรับมีดังนี้ -
- String
- int/Integer
- boolean/Boolean
- byte/Byte
- char/Character
- double/Double
- float/Float
- long/Long
- short/Short
การส่งผ่านพารามิเตอร์ด้วยDataproviders
เมื่อคุณต้องการส่งผ่านพารามิเตอร์ที่ซับซ้อนหรือพารามิเตอร์ที่จำเป็นต้องสร้างจาก Java (อ็อบเจ็กต์ที่ซับซ้อนอ็อบเจ็กต์ที่อ่านจากไฟล์คุณสมบัติหรือฐานข้อมูล ฯลฯ ) พารามิเตอร์สามารถส่งผ่านโดยใช้ Dataproviders
ผู้ให้บริการข้อมูลเป็นวิธีการที่มีคำอธิบายประกอบ @DataProvider. คำอธิบายประกอบนี้มีแอตทริบิวต์สตริงเดียวเท่านั้น: ชื่อ หากไม่ได้ระบุชื่อชื่อของผู้ให้บริการข้อมูลจะตั้งค่าเริ่มต้นเป็นชื่อของเมธอดโดยอัตโนมัติ ผู้ให้บริการข้อมูลส่งคืนอาร์เรย์ของวัตถุ
ตัวอย่างต่อไปนี้สาธิตวิธีใช้ผู้ให้บริการข้อมูล ตัวอย่างแรกเกี่ยวกับ @DataProvider โดยใช้ Vector, String หรือ Integer เป็นพารามิเตอร์และตัวอย่างที่สองเกี่ยวกับ @DataProvider โดยใช้ object เป็นพารามิเตอร์
ตัวอย่าง 1
ที่นี่ @DataProvider ส่ง Integer และ Boolean เป็นพารามิเตอร์
Create Java class
สร้างคลาส java ชื่อ PrimeNumberChecker.java คลาสนี้ตรวจสอบว่าตัวเลขเป็นจำนวนเฉพาะหรือไม่ สร้างชั้นเรียนนี้ในC:\>TestNG_WORKSPACE.
public class PrimeNumberChecker {
public Boolean validate(final Integer primeNumber) {
for (int i = 2; i < (primeNumber / 2); i++) {
if (primeNumber % i == 0) {
return false;
}
}
return true;
}
}
Create Test Case Class
สร้างคลาสทดสอบ java เช่น ParamTestWithDataProvider1.java
กำหนดเมธอด primeNumbers () ซึ่งกำหนดให้เป็นผู้ให้บริการข้อมูลโดยใช้คำอธิบายประกอบ วิธีนี้ส่งคืนอาร์เรย์ของวัตถุ
เพิ่มวิธีการทดสอบ testPrimeNumberChecker () ในคลาสทดสอบของคุณ วิธีนี้ใช้จำนวนเต็มและบูลีนเป็นพารามิเตอร์อินพุต วิธีนี้ตรวจสอบว่าพารามิเตอร์ที่ส่งผ่านเป็นจำนวนเฉพาะหรือไม่
เพิ่มคำอธิบายประกอบ@Test (dataProvider = "test1")ลงในวิธีนี้ แอตทริบิวต์ dataProvider ถูกจับคู่กับ "test1"
สร้างไฟล์คลาส java ชื่อ ParamTestWithDataProvider1.java ใน C:\>TestNG_WORKSPACE.
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class ParamTestWithDataProvider1 {
private PrimeNumberChecker primeNumberChecker;
@BeforeMethod
public void initialize() {
primeNumberChecker = new PrimeNumberChecker();
}
@DataProvider(name = "test1")
public static Object[][] primeNumbers() {
return new Object[][] {{2, true}, {6, false}, {19, true}, {22, false}, {23, true}};
}
// This test will run 4 times since we have 5 parameters defined
@Test(dataProvider = "test1")
public void testPrimeNumberChecker(Integer inputNumber, Boolean expectedResult) {
System.out.println(inputNumber + " " + expectedResult);
Assert.assertEquals(expectedResult, primeNumberChecker.validate(inputNumber));
}
}
Create testng.xml
สร้าง testng.xml C:\>TestNG_WORKSPACE เพื่อดำเนินการกรณีทดสอบ
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<classes>
<class name = "ParamTestWithDataProvider1" />
</classes>
</test>
</suite>
คอมไพล์คลาสกรณีทดสอบโดยใช้ javac
C:\TestNG_WORKSPACE>.javac ParamTestWithDataProvider1.java PrimeNumberChecker.java
ตอนนี้เรียกใช้ testng.xml
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
ตรวจสอบผลลัพธ์
2 true
6 false
19 true
22 false
23 true
===============================================
Suite1
Total tests run: 5, Failures: 0, Skips: 0
===============================================
ตัวอย่าง 2
ที่นี่ @DataProvider ส่ง Object เป็นพารามิเตอร์
Create Java class
สร้างคลาส java Bean.java ซึ่งเป็นอ็อบเจ็กต์ธรรมดาที่มีเมธอด get / set ใน C:\>TestNG_WORKSPACE.
public class Bean {
private String val;
private int i;
public Bean(String val, int i) {
this.val = val;
this.i = i;
}
public String getVal() {
return val;
}
public void setVal(String val) {
this.val = val;
}
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
}
Create Test Case Class
สร้างคลาสทดสอบ java เช่น ParamTestWithDataProvider2.java
กำหนดเมธอด primeNumbers () ซึ่งกำหนดให้เป็นผู้ให้บริการข้อมูลโดยใช้คำอธิบายประกอบ วิธีนี้ส่งคืนอาร์เรย์ของวัตถุ
เพิ่มวิธีการทดสอบ testMethod () ในชั้นเรียนทดสอบของคุณ วิธีนี้ใช้ object bean เป็นพารามิเตอร์
เพิ่มคำอธิบายประกอบ@Test (dataProvider = "test1")ลงในวิธีนี้ แอตทริบิวต์ dataProvider ถูกจับคู่กับ "test1"
สร้างไฟล์คลาส java ชื่อ ParamTestWithDataProvider2.java ใน C:\>TestNG_WORKSPACE.
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class ParamTestWithDataProvider2 {
@DataProvider(name = "test1")
public static Object[][] primeNumbers() {
return new Object[][] { { new Bean("hi I am the bean", 111) } };
}
@Test(dataProvider = "test1")
public void testMethod(Bean myBean) {
System.out.println(myBean.getVal() + " " + myBean.getI());
}
}
Create testng.xml
สร้าง testng.xml ใน C:\>TestNG_WORKSPACE เพื่อดำเนินการกรณีทดสอบ
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<classes>
<class name = "ParamTestWithDataProvider2" />
</classes>
</test>
</suite>
รวบรวมคลาสกรณีทดสอบโดยใช้ javac
C:\TestNG_WORKSPACE>javac ParamTestWithDataProvider2.java Bean.java
ตอนนี้เรียกใช้ testng.xml
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
ตรวจสอบผลลัพธ์
hi I am the bean 111
===============================================
Suite1
Total tests run: 1, Failures: 0, Skips: 0
===============================================
ตอนนี้คุณเข้าใจ TestNG และการทดสอบต่างๆแล้วตอนนี้คุณต้องกังวลเกี่ยวกับวิธีการ refactor โค้ด JUnit ที่มีอยู่ของคุณ ไม่ต้องกังวลเพราะ TestNG มีวิธีเปลี่ยนจาก JUnit เป็น TestNG ตามจังหวะของคุณเอง คุณสามารถดำเนินการกรณีทดสอบ JUnit ที่มีอยู่ได้โดยใช้ TestNG
TestNG สามารถจดจำและเรียกใช้การทดสอบ JUnit โดยอัตโนมัติเพื่อให้คุณสามารถใช้ TestNG เป็นตัววิ่งสำหรับการทดสอบที่มีอยู่ทั้งหมดของคุณและเขียนการทดสอบใหม่โดยใช้ TestNG สิ่งที่คุณต้องทำคือวางไลบรารี JUnit บนพา ธ คลาส TestNG เพื่อให้สามารถค้นหาและใช้คลาส JUnit เปลี่ยนนักวิ่งทดสอบของคุณจาก JUnit เป็น TestNG ใน Ant แล้วเรียกใช้ TestNG ในโหมด "ผสม" ด้วยวิธีนี้คุณสามารถทำการทดสอบทั้งหมดของคุณในโครงการเดียวกันแม้จะอยู่ในแพ็คเกจเดียวกันและเริ่มใช้ TestNG วิธีนี้ยังช่วยให้คุณสามารถแปลงการทดสอบ JUnit ที่มีอยู่เป็น TestNG ได้ทีละน้อย
ให้เรามีตัวอย่างเพื่อแสดงให้เห็นถึงความสามารถที่น่าทึ่งของ TestNG
สร้าง JUnit Test Case Class
สร้างคลาส java ซึ่งเป็นคลาสทดสอบ JUnit, TestJunit.java ใน C:\>TestNG_WORKSPACE.
import org.junit.Test;
import static org.testng.AssertJUnit.assertEquals;
public class TestJunit {
@Test
public void testAdd() {
String str = "Junit testing using TestNG";
AssertEquals("Junit testing using TestNG",str);
}
}
ตอนนี้ขอเขียน testng.xml ใน C:\>TestNG_WORKSPACEซึ่งจะมีแท็ก <suite> ดังนี้ -
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name = "Converted JUnit suite" >
<test name = "JUnitTests" junit="true">
<classes>
<class name = "TestJunit" />
</classes>
</test>
</suite>
ในการดำเนินการกรณีทดสอบ JUnit ให้กำหนดคุณสมบัติjunit = "true"ดังใน xml ด้านบน คลาสกรณีทดสอบ JUnit TestJunit ถูกกำหนดในชื่อคลาส
สำหรับ JUnit 4 TestNG จะใช้org.junit.runner.JUnitCore runner เพื่อทำการทดสอบของคุณ
รวบรวมคลาส java ทั้งหมดโดยใช้ javac
C:\TestNG_WORKSPACE>javac TestJunit.java
ตอนนี้เรียกใช้ testng.xml ซึ่งจะเรียกใช้กรณีทดสอบ JUnit เป็น TestNG
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE:C:\TestNG_WORKSPACE\lib\junit-4.11.jar" org.testng.TestNG testng.xml
ที่นี่เราได้วาง junit-4.11.jar ไว้ใต้ C: \ TestNG_WORKSPACE \ lib \ junit-4.11.jar
ตรวจสอบผลลัพธ์
===============================================
Converted JUnit suite
Total tests run: 1, Failures: 0, Skips: 0
===============================================
การรายงานเป็นส่วนที่สำคัญที่สุดของการดำเนินการทดสอบเนื่องจากจะช่วยให้ผู้ใช้เข้าใจผลลัพธ์ของการดำเนินการทดสอบจุดล้มเหลวและสาเหตุของความล้มเหลว ในทางกลับกันการบันทึกเป็นสิ่งสำคัญที่จะต้องคอยติดตามขั้นตอนการดำเนินการหรือการดีบักในกรณีที่เกิดความล้มเหลว
โดยค่าเริ่มต้น TestNG จะสร้างรายงานประเภทอื่นสำหรับการดำเนินการทดสอบ ซึ่งรวมถึงเอาต์พุตรายงาน HTML และ XML TestNG ยังอนุญาตให้ผู้ใช้เขียนรายงานของตนเองและใช้กับ TestNG นอกจากนี้ยังมีตัวเลือกในการเขียนคนตัดไม้ของคุณเองซึ่งจะมีการแจ้งเตือนเมื่อรันไทม์โดย TestNG
มีสองวิธีในการสร้างรายงานด้วย TestNG -
Listeners- สำหรับการใช้งานคลาส Listener คลาสจะต้องใช้อินเทอร์เฟซorg.testng.ITestListener คลาสเหล่านี้ได้รับการแจ้งเตือนที่รันไทม์โดย TestNG เมื่อการทดสอบเริ่มต้นเสร็จสิ้นล้มเหลวข้ามหรือผ่านไป
Reporters- สำหรับการใช้งานคลาสการรายงานคลาสจะต้องใช้อินเทอร์เฟซorg.testng.IReporter คลาสเหล่านี้เรียกว่าเมื่อการรันชุดโปรแกรมทั้งหมดสิ้นสุดลง อ็อบเจ็กต์ที่มีข้อมูลของการทดสอบทั้งหมดจะถูกส่งผ่านไปยังคลาสนี้เมื่อถูกเรียก
ในบทนี้เราจะมีสี่ตัวอย่างที่แตกต่างกันเพื่อแสดงให้เห็นถึงสี่กรณีที่แตกต่างกันของการรายงานและการบันทึก
ซีเนียร์ | กรณีและตัวอย่าง |
---|---|
1 | การบันทึกแบบกำหนดเอง ตัวอย่างนี้แสดงวิธีการเขียนคนตัดไม้ของคุณเอง |
2 | Custom Reporter ตัวอย่างนี้แสดงให้เห็นถึงวิธีการเขียนนักข่าวของคุณเอง |
3 | รายงาน HTML และ XML ตัวอย่างนี้แสดงรายงาน HTML และ XML เริ่มต้นที่สร้างโดย TestNG |
4 | รายงาน JUnit ตัวอย่างนี้แสดงวิธีสร้างรายงาน JUnit จากรายงาน TestNG |
ในบทนี้เราจะสาธิตวิธีเรียกใช้ TestNG โดยใช้ ANT ทำตามขั้นตอนด้านล่าง -
ขั้นตอนที่ 1: ดาวน์โหลด Apache Ant
ดาวน์โหลดApache Antเวอร์ชันล่าสุด
ระบบปฏิบัติการ | ชื่อที่เก็บถาวร |
---|---|
Windows | apache-ant-1.8.4-bin.zip |
ลินุกซ์ | apache-ant-1.8.4-bin.tar.gz |
Mac | apache-ant-1.8.4-bin.tar.gz |
ขั้นตอนที่ 2: ตั้งค่า Ant Environment
ตั้งค่า ANT_HOMEตัวแปรสภาพแวดล้อมเพื่อชี้ไปยังตำแหน่งไดเร็กทอรีฐานซึ่งไลบรารี ANT ถูกเก็บไว้ในเครื่องของคุณ สมมติว่าเราเก็บ Ant libraries ไว้ในโฟลเดอร์ apache-ant-1.8.4 โฟลเดอร์
ระบบปฏิบัติการ | เอาต์พุต |
---|---|
Windows | ตั้งค่าตัวแปรสภาพแวดล้อม ANT_HOME เป็น C: \ Program Files \ Apache Software Foundation \ apache-ant-1.8.4 |
ลินุกซ์ | ส่งออก ANT_HOME = / usr / local / apache-ant-1.8.4 |
Mac | ส่งออก ANT_HOME = / Library / apache-ant-1.8.4 |
ผนวกตำแหน่งคอมไพเลอร์ Ant เข้ากับ System Path ดังนี้ -
ระบบปฏิบัติการ | คำอธิบาย |
---|---|
Windows | ต่อท้ายสตริง% ANT_HOME \ bin ที่ส่วนท้ายของตัวแปรระบบ Path |
ลินุกซ์ | ส่งออกเส้นทาง =$PATH:$ANT_HOME / bin / |
Mac | ไม่จำเป็นต้องใช้. |
ขั้นตอนที่ 3: ดาวน์โหลด TestNG Archive
ดาวน์โหลดไฟล์ jar ที่ต้องการ http://www.testng.org.
ระบบปฏิบัติการ | ชื่อที่เก็บถาวร |
---|---|
Windows | testng-6.8.jar |
ลินุกซ์ | testng-6.8.jar |
Mac | testng-6.8.jar |
ขั้นตอนที่ 4: สร้างโครงสร้างโครงการ
สร้างโฟลเดอร์ TestNGWithAnt ใน C:\>TestNG_WORKSPACE.
สร้างโฟลเดอร์ src ใน C:\>TestNG_WORKSPACE>TestNGWithAnt.
สร้างโฟลเดอร์ test ใน C:\>TestNG_WORKSPACE>TestNGWithAnt.
สร้างโฟลเดอร์ lib ใน C:\>TestNG_WORKSPACE>TestNGWithAnt.
สร้าง MessageUtil ชั้นเรียนใน C:\>TestNG_WORKSPACE>TestNGWithAnt>src โฟลเดอร์
/*
* This class prints the given message on console.
*/
public class MessageUtil {
private String message;
//Constructor
//@param message to be printed
public MessageUtil(String message) {
this.message = message;
}
// prints the message
public void printMessage() {
System.out.println(message);
return message;
}
// add "Hi!" to the message
public String salutationMessage() {
message = "Hi!" + message;
System.out.println(message);
return message;
}
}
สร้างคลาส TestMessageUtil ใน C:\>TestNG_WORKSPACE>TestNGWithAnt>src โฟลเดอร์
import org.testng.Assert;
import org.testng.annotations.Test;
public class TestMessageUtil {
String message = "Manisha";
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testPrintMessage() {
System.out.println("Inside testPrintMessage()");
Assert.assertEquals(message,messageUtil.printMessage());
}
@Test
public void testSalutationMessage() {
System.out.println("Inside testSalutationMessage()");
message = "Hi!" + "Manisha";
Assert.assertEquals(message,messageUtil.salutationMessage());
}
}
คัดลอก testng-6.8.jar ใน C:\>TestNG_WORKSPACE>TestNGWithAnt>lib โฟลเดอร์
สร้าง ANT build.xml
ขั้นแรกเราต้องกำหนดภารกิจ TestNG Ant ดังนี้ -
<taskdef name = "testng" classname = "org.testng.TestNGAntTask">
<classpath>
<pathelement location = "lib/testng-6.8.jar"/>
</classpath>
</taskdef>
จากนั้นเราจะใช้ <testng> ภารกิจใน Ant เพื่อดำเนินการกรณีทดสอบ TestNG ของเรา
build.xml ไฟล์มีดังนี้ -
<project name = "TestNGTest" default = "test" basedir = ".">
<!-- Define <testng> task -->
<taskdef name = "testng" classname = "org.testng.TestNGAntTask">
<classpath>
<pathelement location = "lib/testng-6.8.jar"/>
</classpath>
</taskdef>
<property name = "testdir" location = "test" />
<property name = "srcdir" location = "src" />
<property name = "libdir" location = "lib" />
<property name = "full-compile" value="true" />
<path id = "classpath.base"/>
<path id = "classpath.test">
<fileset dir = "${libdir}"> <include name = "**/*.jar" /> </fileset> <pathelement location = "${testdir}" />
<pathelement location = "${srcdir}" /> <path refid = "classpath.base" /> </path> <target name = "clean" > <delete verbose="${full-compile}">
<fileset dir = "${testdir}" includes="**/*.class" /> </delete> </target> <target name = "compile" depends="clean"> <javac srcdir = "${srcdir}" destdir = "${testdir}" verbose="${full-compile}">
<classpath refid = "classpath.test"/>
</javac>
</target>
<target name = "test" depends="compile">
<testng outputdir = "${testdir}" classpathref="classpath.test"> <xmlfileset dir = "${srcdir}" includes="testng.xml"/>
</testng>
</target>
</project>
รันคำสั่ง Ant ต่อไปนี้
C:\TestNG_WORKSPACE\TestNGWithAnt>ant
ตรวจสอบผลลัพธ์
test:
[testng] [TestNG] Running:
[testng] C:\TestNG_WORKSPACE\TestNGWithAnt\src\testng.xml
[testng]
[testng] Inside testPrintMessage()
[testng] Manisha
[testng] Inside testSalutationMessage()
[testng] Hi!Manisha
[testng]
[testng] ===============================================
[testng] Plug ANT test Suite
[testng] Total tests run: 2, Failures: 0, Skips: 0
[testng] ===============================================
[testng]
BUILD SUCCESSFUL
Total time: 1 second
ในการตั้งค่า TestNG ด้วย Eclipse ให้ทำตามขั้นตอนด้านล่าง -
ขั้นตอนที่ 1: ดาวน์โหลด TestNG Archive
ดาวน์โหลดไฟล์ jar TestNG เวอร์ชันล่าสุดจาก http://www.testng.org
ระบบปฏิบัติการ | ชื่อที่เก็บถาวร |
---|---|
Windows | testng-6.8.jar |
ลินุกซ์ | testng-6.8.jar |
Mac | testng-6.8.jar |
เราถือว่าคุณได้คัดลอกไฟล์ JAR ด้านบนในโฟลเดอร์ C: \> TestNG
ขั้นตอนที่ 2: ตั้งค่าสภาพแวดล้อม Eclipse
เปิด eclipse →คลิกขวาที่โปรเจ็กต์และไปที่ property → Build Path → Configure Build Path และเพิ่ม testng-6.8.jar ในไลบรารีโดยใช้ปุ่มAdd External Jar
เราถือว่า Eclipse ของคุณมีปลั๊กอิน TestNG ในตัว หากไม่สามารถใช้งานได้โปรดรับเวอร์ชันล่าสุดโดยใช้ไซต์อัปเดต
ใน Eclipse IDE ของคุณเลือกการปรับปรุงความช่วยเหลือ / Software / ค้นหาและติดตั้ง
ค้นหาคุณสมบัติใหม่ที่จะติดตั้ง
ไซต์ระยะไกลใหม่
สำหรับ Eclipse 3.4 ขึ้นไปให้ป้อน http://beust.com/eclipse.
สำหรับ Eclipse 3.3 และต่ำกว่าให้ป้อน http://beust.com/eclipse1.
ตรวจสอบให้แน่ใจในช่อง URL ที่มีการตรวจสอบและคลิกถัดไป
จากนั้น Eclipse จะแนะนำคุณตลอดกระบวนการ
ตอนนี้ Eclipse ของคุณพร้อมแล้วสำหรับการพัฒนากรณีทดสอบ TestNG
ขั้นตอนที่ 3: ตรวจสอบการติดตั้ง TestNG ใน Eclipse
สร้างโครงการ TestNGProject ใน Eclipse ที่ตำแหน่งใดก็ได้
สร้างคลาส MessageUtil เพื่อทดสอบในโครงการ
/*
* This class prints the given message on console.
*/
public class MessageUtil {
private String message;
//Constructor
//@param message to be printed
public MessageUtil(String message) {
this.message = message;
}
// prints the message
public String printMessage() {
System.out.println(message);
return message;
}
}
สร้างคลาสทดสอบ TestNGExample ในโปรเจ็กต์
import org.testng.Assert;
import org.testng.annotations.Test;
public class TestNGExample {
String message = "Hello World";
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testPrintMessage() {
Assert.assertEquals(message,messageUtil.printMessage());
}
}
โครงสร้างโครงการควรเป็นดังนี้ -
สุดท้ายตรวจสอบผลลัพธ์ของโปรแกรมโดยคลิกขวาที่โปรแกรมและเรียกใช้เป็น TestNG
ตรวจสอบผลลัพธ์