• Selenium自动化的JUnit参数化实践


    作为自动化测试人员,经常会遇到这样Selenium测试自动化场景:需要一次又一次地执行相同的测试用例,只是使用不同的输入和环境配置,从而使工作变得冗长且多余。

    为了处理这种用例冗余,大多数人都会选择可以选择参数化测试。使用参数化测试,测试人员可以再次运行相同的自动化测试脚本,但使用不同的数据。参数化测试通过利用测试方法收集结果,有助于节省重复编写相同测试所花费的时间。

    在本文中,我将展示如何为Selenium测试自动化实现JUnit参数化测试。如果你还不熟悉JUnit,请参阅有关使用JUnitSelenium进行自动测试的文章。

    为什么需要JUnit参数化测试?

    让我们先从Selenium JUnit的测试场景开始,如果有个需求想要对一个购物网站执行Selenium自动化测试。测试人员已经为产品编写了测试用例脚本,但是你很快意识到,不仅需要针对不同的商品,而且还要针对不同的OS系统浏览器版本重复运行用例以确保兼容性。

    首先,对于Selenium测试自动化,我们需要多个数据集合来执行测试。随之而来的是一个跨浏览器矩阵,可以覆盖绝大多数用户的实际情况。其次,我们需要学习如何编写测试脚本从已存储的数据集中获取数据。

    值得关注的是,在对Web应用程序进行自动化测试时,很难为后续的测试迭代维护单个稳定可靠的数据源。除非是特殊基础数据以及一些极少变更的业务场景,更多的时候我们很难创建用于相同配置的同一测试用例的多个Selenium测试自动化脚本。简而言之,硬编码只会带来大量的维护工作,因此需要JUnit参数化测试来帮助您节省Selenium测试自动化周期中的时间和精力。

    为了在我们的Selenium测试自动化脚本中使用多个数据集,首先想到的是使用Excel工作表来获取该数据。但是,在打算创建更具体的Selenium测试自动化脚本的情况时,就需要使用像JUnit这样的多合一框架。JUnit使我们能够以更健壮的方式编写测试用例,并使我们拥有多种功能,其中之一就是参数化

    JUnit参数化的类型

    两种使用JUnit参数化测试的有效方法。

    • 使用@Parameters注解进行参数化
    • 使用Excel文件进行参数化

    首先,使用@Parameters批注进行参数化,它允许将测试数据作为Java集合传递给Selenium脚本。任何数据更改,测试人员所需要做的就是使用所需数据编辑集合。

    其次,使用Excel进行参数化,测试人员可以自由地从外部文件中获取数据,无论数量是多少,都可以加载到Selenium测试自动化脚本中。

    我们还可以使用JUnit params依赖关系,通过使用注释@ParameterizedTest代替@Test注解来参数化我们的测试。还可以使用下面列出的各种注释将参数传递给JUnit Parameterized Tests

    • @ValueSource
    • @EnumSource
    • @CsvSource
    • @CsvFileSource
    • @MethodSource

    使用@Parameters批注进行参数化

    下面是搜索一些关键字的Demo。现在,让我们看看如果编写没有参数化概念的原始代码,代码将是什么样。

    package FunTester;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.chrome.ChromeDriver;
    
    public class TestNormExec {  	
      	WebDriver driver;
       	@Before
      	public void startUp(){    	
             	System.out.println("----开始测试----");
      	System.setProperty("webdriver.chrome.driver","chromedriver.exe的path");
             	driver = new ChromeDriver();
      	driver.get("https://www.****.com/");
             	driver.manage().window().maximize();
      	}
      	
      	@Test
      	public void searchKeys(){
             	String keyWrd = "FunTester";
             	WebElement srchBox = driver.findElement(By.name("q"));
             	srchBox.sendKeys(keyWrd + "
    ");
             	String title = driver.getTitle();
             	System.out.println("The title is : " +title);
      	}
      	
       	@After
      	public void tearDown(){
             	System.out.println("----结束----");
             	driver.quit();
       	}
     }
    

    为了使用不同的数据集运行Selenium测试自动化,keyWrd对象每次运行测试用例时都必须手动更改字符串的值。为了简化更改输入值的过程,我们可以使用JUnit参数化测试对测试用例进行参数化。这也将帮助我们消除Selenium测试用例中的冗余。

    现在,让我们进一步探讨用于Selenium测试自动化的JUnit测试参数化。我将创建一个包含测试方法的类。请注意,在这里,我将关键字作为方法参数传递,这与以前的方法不同,在以前的方法中,我将搜索关键字存储在变量中。

    package FunTester;
    import org.junit.Test;
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.chrome.ChromeDriver;
     
    public class Search {
      
      	WebDriver driver;  	
      	@Test
      	public void searchKeys(String kyWrd, String kyWrd1){
             	System.out.println("----开始测试----");
      	System.setProperty("webdriver.chrome.driver","chromedriver.exe的path");
             	driver = new ChromeDriver();
      	driver.get("https://www.****.com/");
             	driver.manage().window().maximize();
             	WebElement srchBox = driver.findElement(By.name("q"));
             	srchBox.sendKeys(kyWrd + " " + kyWrd1 + "
    ");
             	String title = driver.getTitle();
             	System.out.println("The title is : " +title);
             	System.out.println("----结束----");
             	driver.quit();
       	}
      }
    

    在下一步中,我将创建一个带有@RunWith注解的类。此类将在新实例上运行测试。除此之外,我还将为此类创建一个构造函数,该构造函数将存储要测试的数据。

    在此示例中,两个变量将传递给此构造函数。接下来,要生成并返回测试数据,我将创建一个静态方法,其返回类型为Collection。此集合的每个条目将给出一次运行的数据,例如SeleniumFunTester等等,将是一次执行的数据。

    此方法的Parameters注解为要运行的测试提供了输入数据集。这是此类的最终代码。

    
    package FunTester;
    import java.util.Arrays;
    import java.util.Collection;
    import org.junit.Before;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.junit.runners.Parameterized;
    
    @RunWith(Parameterized.class)
    public class SearchTest {
    
      	private String kyWrd1;
    
      	private String kyWrd2;
    
      	private SearchGoogle searchGoogle;
       	public SearchGoogleTest(String kyWrd1, String kyWrd2){
             	super();
             	this.kyWrd1 = kyWrd1;
             	this.kyWrd2 = kyWrd2;
       	}
     
      	@Before
      	public void init(){
             	search = new Search();
             	}
             	
      	@Parameterized.Parameters
      	public static Collection data(){
             	return Arrays.asList(new Object[][]{{"FunTester","FunTester"},{"JMeter","Selenium"},{"UiAutomator","appium"}});
      	}	
      	
      	@Test
      	public void testSearch(){
      	  	searchGoogle.searchKeys(kyWrd1,kyWrd2);
      	}
      	
    }
    
    

    创建JUnit参数化测试的最后一步是创建一个测试运行类,该类将驱动我们的测试执行。此类将在JUnitCore.runClasses的帮助下运行测试,并且我们的测试类将作为参数传递给它。

    package parameterizedRun;
    import org.junit.runner.JUnitCore;
    import org.junit.runner.Result;
    import org.junit.runner.notification.Failure;
    
    public class Runner {
       	public static void main(String[] args){
       	
             	Result res = JUnitCore.runClasses(SearchTest.class);
         
             	for(Failure fail:res.getFailures()){
             	  	System.out.println(fail.toString());
             	}
              	  	System.out.println(res.wasSuccessful());
      	}
    }
    

    使用Excel进行参数化

    使用Excel数据驱动测试(通常被称为参数化)进行参数化是处理需要不同测试数据的测试脚本的有效方法。来自外部文件的数据在运行时被读取并加载到测试脚本中,而不是对其进行硬编码。

    一些常规方案可以是测试具有多个用户搜索不同的关键字,这种方法的主要好处是代码可重用性,无需维护Selenium测试自动化脚本,只需更新文件中的测试数据即可。让我们看看如何使用数据驱动框架在JUnit中参数化我们的测试用例。

    Selenium JUnit教程中,我们需要进行Excel参数化的主要元素是Excel工作表。我创建了一个由要搜索的关键字组成的Excel工作表,并将其放置在我的项目位置的Data件夹下。

    一旦我们准备好数据,下一步就是创建将加载Excel工作簿的工具类文件,然后从工作表和相应的单元格中读取数据。早年写过一些实践:java使用poi写入excel文档的一种解决方案java使用poi读取excel文档的一种解决方案

    现在,我们已经准备好一个类,其中包含一个用于从Excel读取数据的方法,让我们继续在另一个类中编写测试方法,以传递与我们需要检索的关键字相对应的参数,同时调用获取数据的方法从Excel文件中。

    package FunTester;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.chrome.ChromeDriver;
    
    public class TestSearch {
    
    	WebDriver driver;
    
    	ReadExcel excel = new ReadExcel();	  	
      	@Before
      	public void startUp(){
             	System.out.println("----开始测试----");
      	System.setProperty("webdriver.chrome.driver","chromedriver.exe的path");
             	driver = new ChromeDriver();
      	driver.get("https://www.****.com/");
             		driver.manage().window().maximize();
      	}
      	
      	@Test
      	public void searchKeys(){
             	System.out.println("----搜索关键字----");
             	WebElement srchBox = driver.findElement(By.name("q"));   
             	srchBox.sendKeys(excel.getData(0, 1, 0) + "
    ");                  	        	String title = driver.getTitle();
             	System.out.println("The title is : " +title);
      	}
      	
      	@After
      	public void tearDown(){
             	System.out.println("----结束测试----");
             	driver.quit();
      	}
    }
    

    运行上述代码后,Selenium测试自动化脚本将从Excel工作表的第二行获取excel数据,要想遍历测试,可以参考@Parameters注解提供的方案。


    公众号FunTester首发,原创分享爱好者,腾讯云、开源中国和掘金社区首页推荐,知乎准八级强者,欢迎关注、交流,禁止第三方擅自转载。

    FunTester热文精选

  • 相关阅读:
    ORA-12560:TNS:协议适配器错误
    oracledbconsole db启动问题
    安装tomcat出现failed to install tomcat6 service错误及解决方法(转载)
    关于Eclipse配置tomcat
    js indexof用法indexOf()定义和用法
    手机被没收事件。。。
    一维数组,求最大子数组!!!
    用n(0)次求一个数组里面最大子数组的和(数组可以输入负数)
    jwt认证
    序列化组件
  • 原文地址:https://www.cnblogs.com/FunTester/p/13824855.html
Copyright © 2020-2023  润新知