paint-brush
在 Selenium、JUnit5 和 Gauge Framework 中使用自动化测试的 7 个理由by@lirany
578
578

在 Selenium、JUnit5 和 Gauge Framework 中使用自动化测试的 7 个理由

Liran Yushinsky13m2023/02/13
Read on Terminal Reader

自动化测试可以在多个环境、多个浏览器、多个设备和多个数据集上并行运行。与手动测试相比,自动化测试更不容易出现人为错误,这有助于提高测试过程的准确性和可靠性。自动化测试是可重复的、一致的和可靠的,这有助于减少误报和漏报。
featured image - 在 Selenium、JUnit5 和 Gauge Framework 中使用自动化测试的 7 个理由
Liran Yushinsky HackerNoon profile picture



自动化测试可以在多个环境、多个浏览器、多个设备和多个数据集上并行运行。


这些测试比手动测试更不容易出现人为错误,这有助于提高测试过程的准确性和可靠性。此外,它们是可重复的、一致的和可靠的,这有助于减少误报和漏报。在本文中,我将讨论为什么您应该在 Selenium、JUnit5 和 Gauge Framework 中使用自动化测试。



  1. 提高效率

    自动化测试可以比手动测试运行得更快,从而允许在更短的时间内运行更多的测试。这有助于更快地识别问题和错误,从长远来看可以节省时间和资源。自动化测试可以在多个环境、多个浏览器、多个设备和多个数据集上并行运行,从而提高了测试过程的整体效率。


     import com.thoughtworks.gauge.Step import org.openqa.selenium.By import org.openqa.selenium.WebDriver import org.openqa.selenium.chrome.ChromeDriver class AutomationTest { private lateinit var driver: WebDriver @Step("Open the browser and navigate to the website") fun openBrowser() { System.setProperty("webdriver.chrome.driver", "/path/to/chrome/driver") driver = ChromeDriver() driver.get("https://www.example.com") } @Step("Search for <searchTerm>") fun search(searchTerm: String) { driver.findElement(By.name("q")).sendKeys(searchTerm) driver.findElement(By.name("btnK")).click() } @Step("Close the browser") fun closeBrowser() { driver.quit() } }


    这是一个用Kotlin编写的简单测试自动化脚本的示例,它使用Selenium库与网页交互,并使用 Gauge 框架来组织和运行测试。此脚本打开浏览器,导航到网站,执行搜索,然后关闭浏览器。


    因为此测试是自动进行的,所以它比手动执行的运行速度更快。


    这只是一个简单的例子,在一个真实的用例中,你可以有多个场景、多个测试用例和多个测试套件,它们可以自动化并并行运行,从而提高测试过程的整体效率。


    值得注意的是,如果您正在使用 Web 应用程序,还有其他框架和工具可以与 Selenium 结合使用或代替 Selenium,例如 Cypress、WebDriverIO 和 TestCafe,每个框架和工具都有自己的特定功能和优势.


  2. 提高准确性

    与手动测试相比,自动化测试更不容易出现人为错误,这有助于提高测试过程的准确性和可靠性。自动化测试是可重复的、一致的和可靠的,这有助于减少误报和漏报。


     import com.thoughtworks.gauge.Step import org.openqa.selenium.By import org.openqa.selenium.WebDriver import org.openqa.selenium.chrome.ChromeDriver class AutomationTest { private lateinit var driver: WebDriver @Step("Open the browser and navigate to the website") fun openBrowser() { System.setProperty("webdriver.chrome.driver", "/path/to/chrome/driver") driver = ChromeDriver() driver.get("https://www.example.com") } @Step("Search for <searchTerm> and verify the result") fun search(searchTerm: String) { driver.findElement(By.name("q")).sendKeys(searchTerm) driver.findElement(By.name("btnK")).click() val searchResult = driver.findElement(By.xpath("//div[@class='g']")) assert(searchResult.text.contains(searchTerm)) } @Step("Close the browser") fun closeBrowser() { driver.quit() } }


    在此示例中,脚本不仅执行搜索,而且还通过断言返回的搜索结果包含搜索词来验证结果。这有助于确保测试准确无误,并将捕获搜索功能可能出现的任何问题。


    由于该脚本是自动化的,因此每次使用相同的输入执行时,它都会以相同的方式运行,从而确保测试可重复、一致和可靠。这有助于减少手动测试时可能出现的误报和漏报。


    此外,您还可以使用 Gauge 报告、Allure、TestNG、JUnit 等测试报告工具来跟踪测试结果,让您了解测试是失败还是通过。如果它失败了,它会揭示失败背后的原因,这有助于在开发过程中及早发现问题,并防止它们在以后成为更严重的问题。


    3. 启用频繁测试

    可以定期运行自动化测试,例如每次进行代码更改时,这有助于在开发过程中及早发现问题,并防止它们在以后成为更严重的问题。这有助于在开发周期的早期发现错误,并有助于降低修复错误的总体成本。


     import com.thoughtworks.gauge.Step import org.openqa.selenium.By import org.openqa.selenium.WebDriver import org.openqa.selenium.chrome.ChromeDriver import org.junit.jupiter.api.Test import org.junit.jupiter.api.BeforeEach class AutomationTest { private lateinit var driver: WebDriver @BeforeEach fun openBrowser() { System.setProperty("webdriver.chrome.driver", "/path/to/chrome/driver") driver = ChromeDriver() driver.get("https://www.example.com") } @Test fun testSearch() { driver.findElement(By.name("q")).sendKeys("searchTerm") driver.findElement(By.name("btnK")).click() val searchResult = driver.findElement(By.xpath("//div[@class='g']")) assert(searchResult.text.contains("searchTerm")) } @AfterEach fun closeBrowser() { driver.quit() } }


    此脚本使用 JUnit5 框架和@Test注释,将方法标记为测试方法。这允许测试作为测试套件的一部分自动运行。此外,该脚本使用@BeforeEach@AfterEach注释来标记要在每个测试方法之前或之后执行的方法。


    您还可以使用 CI/CD 管道并将自动化测试与其集成,从而允许测试作为构建过程的一部分以及每次代码更改时自动运行。这有助于确保代码更改在部署到生产之前经过测试并且质量良好。

    4.性价比高

    自动化测试可以在没有人为干预的情况下运行,这随着时间的推移降低了测试成本。自动化测试可以定期运行,也可以安排在特定时间运行,从而减少对人力资源的需求。


     import com.thoughtworks.gauge.Step import org.openqa.selenium.By import org.openqa.selenium.WebDriver import org.openqa.selenium.chrome.ChromeDriver import org.junit.jupiter.api.Test import org.junit.jupiter.api.BeforeEach class AutomationTest { private lateinit var driver: WebDriver @BeforeEach fun openBrowser() { System.setProperty("webdriver.chrome.driver", "/path/to/chrome/driver") driver = ChromeDriver() driver.get("https://www.example.com") } @Test fun testSearch() { driver.findElement(By.name("q")).sendKeys("searchTerm") driver.findElement(By.name("btnK")).click() val searchResult = driver.findElement(By.xpath("//div[@class='g']")) assert(searchResult.text.contains("searchTerm")) } @Test fun testSignUp() { driver.findElement(By.linkText("Sign Up")).click() driver.findElement(By.name("username")).sendKeys("myusername") driver.findElement(By.name("password")).sendKeys("mypassword") driver.findElement(By.name("submit")).click() val message = driver.findElement(By.xpath("//div[@class='message']")) assert(message.text.contains("Welcome myusername")) } @AfterEach fun closeBrowser() { driver.quit() } }


    在这个例子中,我们有两个测试用例。第一个用于测试搜索功能,第二个用于测试注册功能。通过在单个脚本中包含多个测试用例,可以提高测试过程的整体效率,从而有助于降低测试的总体成本。


    此外,您可以使用测试参数化,您可以在其中运行具有多个输入和数据集的相同测试用例。这增加了总体测试覆盖率并有助于发现更多错误,从而降低了总体测试成本。


    此外,您可以使用基于云的测试环境,例如 SauceLabs、BrowserStack 和 TestingBot,让您可以在各种浏览器和操作系统上运行测试,而无需维护自己的测试基础设施。这可以降低与维护和扩展测试基础设施相关的成本。


    总的来说,通过减少对人力资源的需求、提高测试过程的效率以及使用基于云的测试环境,自动化测试可以具有成本效益。


    5. 增加覆盖面

    自动化测试可以覆盖手动难以覆盖的广泛场景、输入和用例,从而提高测试的整体覆盖率。自动化测试可以覆盖不同的浏览器、不同的设备、不同版本的操作系统、不同的数据集和不同的场景,从而提高测试的整体覆盖率。


     import com.thoughtworks.gauge.Step import org.openqa.selenium.By import org.openqa.selenium.WebDriver import org.openqa.selenium.chrome.ChromeDriver import org.junit.jupiter.api.Test import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.CsvSource class AutomationTest { private lateinit var driver: WebDriver @BeforeEach fun openBrowser() { System.setProperty("webdriver.chrome.driver", "/path/to/chrome/driver") driver = ChromeDriver() driver.get("https://www.example.com") } @ParameterizedTest @CsvSource(value = ["searchTerm1, expectedResult1", "searchTerm2, expectedResult2", "searchTerm3, expectedResult3"]) fun testSearch(searchTerm: String, expectedResult: String) { driver.findElement(By.name("q")).sendKeys(searchTerm) driver.findElement(By.name("btnK")).click() val searchResult = driver.findElement(By.xpath("//div[@class='g']")) assert(searchResult.text.contains(expectedResult)) } @AfterEach fun closeBrowser() { driver.quit() } }


    在此示例中,我们使用 JUnit5 @ParameterizedTest注释和@CsvSource来运行具有多个输入的相同测试用例,从而增加整体测试覆盖率。测试将使用不同的输入值运行三次,每次都会检查输出是否与预期结果匹配。


    通过这种方式,您可以使用多个数据集测试相同的功能,这有助于发现更多错误并增加整体测试覆盖率。此外,您还可以使用 TestNG、JUnit5 等数据驱动测试框架来运行具有多个输入的测试用例,从而提高整体测试覆盖率。


    6. 提高一致性自动化测试每次都以相同的方式运行,确保不会重复遗漏相同的问题。自动化测试可重复、一致且可靠,可减少误报和漏报。


     import com.thoughtworks.gauge.Step import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response class API_AutomationTest { @Step("GET request to <endpoint> and verify the response") fun testAPI(endpoint: String) { val client = OkHttpClient() val request = Request.Builder() .url(endpoint) .get() .build() val response = client.newCall(request).execute() val json = response.body()?.string() assert(json!!.contains("\"userId\": 1")) } }


    该脚本使用 Gauge 框架和@Step注释,将方法标记为测试场景中的一个步骤。这允许以可读易懂的格式编写测试场景,使测试流程易于理解。


    您还可以使用仪表的数据驱动测试概念,您可以在其中运行具有多个输入的相同测试场景,从而增加整体测试覆盖率并可能发现更多错误。


    此外,您还可以使用仪表的报告功能,该功能提供有关测试场景、测试结果和测试执行时间的清晰简洁的报告。


    7. 实现持续集成和持续交付

    自动化测试是持续集成和交付的关键推动因素,这是现代软件开发的一个重要方面。自动化测试可以与 CI/CD 管道集成,并且可以在每次代码更改时自动运行,确保代码更改在部署到生产之前经过测试并且质量良好。


    您可以使用 CI/CD 管道并将脚本与其集成,允许测试作为构建过程的一部分以及每次代码更改时自动运行。


    例如,你可以使用 Jenkins、Travis、CircleCI 等作为 CI/CD 工具。然后您可以设置作业来构建项目、运行测试用例并在测试通过后将应用程序部署到生产环境。


    这是现代软件开发的一个关键方面,它有助于实现更快、更可靠的软件交付。


 pipeline { agent any stages { stage('Build') { steps { sh './gradlew build' } } stage('Test') { steps { sh 'gauge run specs/' } } stage('Deploy') { steps { sh './deploy.sh' } } } }


这个 Jenkinsfile 定义了一个包含三个阶段的管道:构建、测试和部署。


构建阶段,管道运行命令“./gradlew build”。此命令将构建项目并生成必要的工件。


测试阶段,管道运行命令“gauge run specs/”。此命令将执行 specs 文件夹中的所有仪表测试用例。


部署阶段,管道运行命令“./deploy.sh”。此命令会将应用程序部署到生产环境。


您可以设置 Jenkins 作业来运行此 Jenkinsfile,如果测试通过,它将构建、测试和部署应用程序。


通过此示例,您可以了解如何使用 Jenkinsfile 中的 Gauge 测试来实现持续集成和持续交付。这使您可以自动化测试过程。


最后的想法

  • 通过允许在单个脚本中运行多个测试用例来提高效率。

  • 通过减少人为错误并提供一致的结果来提高准确性。

  • 通过简化定期运行测试来实现频繁测试。

  • 通过降低测试的总体成本和增加测试覆盖率来实现成本效益。

  • 通过允许使用多个输入和数据集运行相同的测试用例来增加覆盖率。

  • 通过确保软件按预期工作来提高一致性。

  • 通过允许测试作为构建过程的一部分自动运行以及每次代码更改,确保代码更改在部署到生产之前经过测试并且质量良好,从而实现持续集成和持续交付。


总体而言,自动化测试有助于提高软件的整体质量、降低测试的总体成本、增加测试覆盖率、提高一致性并实现持续集成和持续交付,从而实现更快、更可靠的软件交付。