การดำเนินการแบบขนานใน Selenium

⚡ สรุปอย่างชาญฉลาด

เซสชัน การทำงานแบบขนาน และการพึ่งพาใน Selenium รวม sessionId ที่ไม่ซ้ำกันสำหรับแต่ละอินสแตนซ์ของ WebDriver เข้ากับ TestNG การควบคุมชุดโปรแกรม ช่วยให้หน้าต่างเบราว์เซอร์หลายหน้าต่างสามารถเรียกใช้สคริปต์อิสระหรือตามลำดับพร้อมกัน และช่วยให้กระบวนการทดสอบการถดถอยเสร็จสิ้นเร็วขึ้น

  • 🧩 หลักการสำคัญ: ทุกครั้งที่มีการสร้างอินสแตนซ์ WebDriver ใหม่ ระบบจะสร้าง sessionId ใหม่ ทำให้ไดรเวอร์สองตัวไม่สามารถใช้คำสั่งหรือคุกกี้ร่วมกันบนเครื่องเดียวกันได้
  • ⚙️ การดำเนินการ: ตั้งค่า parallel=”methods” (หรือ tests, classes, instances) บวกกับ thread-count บน TestNG แท็ก suite ในไฟล์ testng.xml เพื่อกระจายการทำงาน
  • 🧵 parallelism: ใช้ WebDriver หนึ่งตัวต่อเมธอด @Test หนึ่งตัว เพื่อหลีกเลี่ยงปัญหา Race Condition บนหน้าต่างเบราว์เซอร์ที่ใช้ร่วมกันระหว่างการทำงานพร้อมกัน
  • 🔗 การพึ่งพา: จัดลำดับการทดสอบโดยใช้ dependsOnMethods ภายในแท็ก include ของ testng.xml หรือใช้ annotation @Test เมื่อต้องการให้เมธอดหนึ่งทำงานก่อนอีกเมธอดหนึ่ง
  • 🤖 การใช้งาน AI: ระบบ AI สมัยใหม่สามารถทำนายจำนวนเธรดที่เหมาะสม จัดกลุ่มวิธีการขนานที่ปลอดภัย และค้นหาตัวเลือกที่มีแนวโน้มไม่เสถียรจากข้อมูลการทำงานในอดีต

วิธีการเรียกใช้งานการประมวลผลแบบขนานใน Selenium

เพื่อให้เข้าใจวิธีการรันสคริปต์แบบขนาน คุณต้องรู้ก่อนว่าทำอย่างไร Selenium แยกแต่ละเบราว์เซอร์ออกจากกันผ่านเซสชัน

เหตุใดเราจึงต้องมีการจัดการเซสชัน?

ในระหว่างการทดสอบการดำเนินการ Selenium WebDriver ต้องโต้ตอบกับเบราว์เซอร์ในทุกขั้นตอนเพื่อดำเนินการคำสั่งที่กำหนด ในขณะที่การทดสอบนั้นกำลังทำงานอยู่ ผู้ใช้รายอื่นอาจเรียกใช้สคริปต์ที่สองบนเครื่องเดียวกันและเบราว์เซอร์ประเภทเดียวกันก็ได้

การจัดการเซสชัน

ในสถานการณ์เช่นนี้ เราจำเป็นต้องมีกลไกเพื่อป้องกันไม่ให้การดำเนินการทั้งสองทับซ้อนกัน Selenium แก้ไขปัญหานี้ด้วยการจัดการเซสชัน

วิธีบรรลุการจัดการเซสชันใน Selenium เว็บไดร์เวอร์?

หากคุณตรวจสอบ Selenium ในซอร์สโค้ดของ WebDriver คุณจะพบตัวแปรที่ชื่อว่า sessionIdทุกครั้งที่คุณสร้างอินสแตนซ์ WebDriver ใหม่ ระบบจะสร้างอินสแตนซ์ใหม่ขึ้นมา sessionId ถูกสร้างขึ้นและแนบไปกับสิ่งนั้น Firefoxไดรเวอร์ Chrome หรือ IE

บรรลุการจัดการเซสชันใน Selenium ไดรเวอร์เว็บ

คำสั่งต่อๆ ไปทั้งหมดจะทำงานเฉพาะภายในเซสชันเบราว์เซอร์นั้นๆ เท่านั้น

บรรลุการจัดการเซสชันใน Selenium ไดรเวอร์เว็บ

เนื่องจากฟังก์ชันนี้มีอยู่ใน WebDriver อยู่แล้ว จึงไม่จำเป็นต้องกำหนด sessionId ด้วยตนเอง

Code ตัวอย่าง: มีการสร้างเซสชันที่แตกต่างกันสองเซสชันสำหรับอินสแตนซ์ WebDriver สองตัว

การจัดการเซสชัน.java
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

public class SessionHandling {
    public static void main(String... strings) {
        // First session of WebDriver
        WebDriver driver = new FirefoxDriver();
        // Go to guru99 demo site
        driver.get("https://demo.guru99.com/V4/");

        // Second session of WebDriver
        WebDriver driver2 = new FirefoxDriver();
        // Go to guru99 demo site
        driver2.get("https://demo.guru99.com/V4/");
    }
}

วิธีรัน Parallel Tests ด้วย Selenium

ในบางสถานการณ์ คุณอาจต้องการทำการทดสอบหลายอย่างพร้อมกัน เช่น การตรวจสอบข้ามเบราว์เซอร์ หรือห้องสูบบุหรี่ขนาดใหญ่

ในกรณีเช่นนี้ parallel คุณสมบัติบน TestNG แท็กห้องชุดจะช่วยจัดการเรื่องนี้เอง

รันการทดสอบแบบขนานด้วย Selenium

คุณลักษณะ parallel ของแท็ก suite ยอมรับค่าได้สี่ค่า:

ค่าคุณสมบัติความหมาย
การทดสอบทั้งหมด กรณีทดสอบ ภายใน แท็กของ การทดสอบ ไฟล์ XML จะถูกประมวลผลแบบขนาน
ชั้นเรียนกรณีทดสอบทั้งหมดภายใน Java คลาสเรียนทำงานแบบขนาน
วิธีการเมธอดทั้งหมดที่มีคำอธิบายประกอบ @Test จะทำงานแบบขนาน
อินสแตนซ์การทดสอบในอินสแตนซ์เดียวกันจะทำงานแบบขนาน ในขณะที่สองเมธอดของสองอินสแตนซ์ที่แตกต่างกันจะทำงานในเธรดที่ต่างกัน

การขอ thread-count คุณสมบัตินี้จะกำหนดจำนวนเธรดที่จัดสรรให้กับการดำเนินการนั้น จับคู่กับ TestNG กรอบ และ ติดตั้ง TestNG in Eclipse ก่อนเริ่มใช้งาน สำหรับการใช้งานในเครื่องมากกว่าหนึ่งเครื่อง ให้กำหนดเส้นทางชุดคำสั่งเดียวกันผ่านทาง Selenium ตาราง 4 สำหรับการประมวลผลแบบขนานแบบกระจาย

ตัวอย่างที่สมบูรณ์: รันเคสทดสอบสามเคสพร้อมกันและกรอกข้อมูลการเข้าสู่ระบบ https://demo.guru99.com/.

โครงการทั้งหมดมีลักษณะดังนี้:

รันการทดสอบแบบขนานด้วย Selenium

เอกสารGuru99MultipleSession.java
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.Test;

public class TestGuru99MultipleSession {

    @Test
    public void executeSessionOne() {
        // First session of WebDriver
        System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
        WebDriver driver = new ChromeDriver();
        driver.get("https://demo.guru99.com/V4/");
        // Find the user name text box and fill it
        driver.findElement(By.name("uid")).sendKeys("Driver 1");
    }

    @Test
    public void executeSessionTwo() {
        // Second session of WebDriver
        System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
        WebDriver driver = new ChromeDriver();
        driver.get("https://demo.guru99.com/V4/");
        driver.findElement(By.name("uid")).sendKeys("Driver 2");
    }

    @Test
    public void executeSessionThree() {
        // Third session of WebDriver
        System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
        WebDriver driver = new ChromeDriver();
        driver.get("https://demo.guru99.com/V4/");
        driver.findElement(By.name("uid")).sendKeys("Driver 3");
    }
}

TestNG.XML

testng.xml (วิธีการแบบขนาน)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="TestSuite" thread-count="3" parallel="methods">
  <test name="testGuru">
    <classes>
      <class name="TestGuru99MultipleSession"/>
    </classes>
  </test>
</suite>

ลำดับกรณีทดสอบและการพึ่งพา

คุณสามารถกำหนดลำดับและความสัมพันธ์ของสิ่งต่างๆ ได้ กรณีทดสอบ การดำเนินการ สมมติว่าคุณมีกรณีทดสอบสองกรณี testGuru99TC1 และ testGuru99TC2และคุณต้องการ testGuru99TC2 วิ่งก่อน testGuru99TC1. ใช้ dependsOnMethods คุณลักษณะ (หรือ dependsOnGroups (สำหรับการเชื่อมโยงระดับกลุ่ม) เพื่อแก้ไขลำดับนั้น สำหรับการเชื่อมโยงที่กว้างขึ้น กรอบการทำงานอัตโนมัติ ออกแบบ เปรียบเทียบ JUnit vs TestNGและทบทวน ค้นหาองค์ประกอบ อ้างอิงหากการทดสอบที่เกี่ยวข้องของคุณใช้ตัวระบุตำแหน่งร่วมกัน

testng.xml (dependsOnMethods)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="TestSuite" thread-count="3" parallel="methods">
  <test name="testGuru">
    <classes>
      <class name="TestGuru99MultipleSession">
        <include name="testGuru99TC1" dependsOnMethods="testGuru99TC2"/>
        <include name="testGuru99TC2"/>
      </class>
    </classes>
  </test>
</suite>

การขอ TestNG รันไทม์ โฮสต์อยู่ที่ testng.orgโดยจะประเมินการประกาศเหล่านี้ก่อนที่จะเริ่มเธรด ดังนั้นเมธอดที่ขึ้นกับเมธอดอื่นจะเริ่มต้นหลังจากที่เมธอดที่จำเป็นเสร็จสิ้นแล้วเสมอ

คำถามที่พบบ่อย

เซสชันคือ sessionId ที่ไม่ซ้ำกัน ซึ่งถูกสร้างขึ้นทุกครั้งที่มีการสร้างอินสแตนซ์ WebDriver ใหม่ คำสั่งทุกคำสั่งจากไดรเวอร์นั้นจะถูกส่งไปยังเซสชันเบราว์เซอร์ที่ตรงกัน ทำให้การทดสอบแต่ละครั้งแยกออกจากกัน

แอตทริบิวต์ parallel บนแท็ก suite สามารถรับค่าเป็น tests, classes, methods หรือ instances ได้ TestNG สร้างเธรดหลายเธรด (กำหนดโดย thread-count) และเรียกใช้หน่วยที่เลือกพร้อมกัน ซึ่งช่วยลดเวลาในการประมวลผลโดยรวม

ใช้แอตทริบิวต์ dependsOnMethods ภายในแท็ก include ของไฟล์ testng.xml หรือใช้ @Test(dependsOnMethods = “name”) ในโค้ด TestNG จะทำการทดสอบที่จำเป็นก่อน และข้ามการทดสอบที่จำเป็นถัดไปหากล้มเหลว

เครื่องมือ AI จะจัดกลุ่มการทดสอบที่เกี่ยวข้อง ทำนายจำนวนเธรดที่เหมาะสมที่สุดจากเวลาการทำงานในอดีต และจัดลำดับชุดการทดสอบใหม่เพื่อให้การทดสอบที่ใช้เวลานานเริ่มต้นก่อน ซึ่งจะช่วยลดเวลาโดยรวมของกระบวนการสร้างซอฟต์แวร์ลง

ใช่แล้ว AI จะวิเคราะห์กราฟการเรียกใช้และบันทึกความล้มเหลวในอดีตเพื่อแนะนำการเชื่อมโยง dependsOnMethods ระบุการพึ่งพาแบบวนซ้ำ และเสนอกลุ่มขนานที่ปลอดภัย ซึ่งช่วยลดการดูแลรักษาไฟล์ testng.xml ด้วยตนเอง

สรุปโพสต์นี้ด้วย: