做为自动化测试人员,常常会遇到这样Selenium
测试自动化场景:须要一次又一次地执行相同的测试用例,只是使用不一样的输入和环境配置,从而使工做变得冗长且多余。java
为了处理这种用例冗余,大多数人都会选择能够选择参数化测试。使用参数化测试,测试人员能够再次运行相同的自动化测试脚本,但使用不一样的数据。参数化测试经过利用测试方法收集结果,有助于节省重复编写相同测试所花费的时间。web
在本文中,我将展现如何为Selenium
测试自动化实现JUnit
参数化测试。若是你还不熟悉JUnit
,请参阅有关使用JUnit
和Selenium
进行自动测试的文章。chrome
为何须要JUnit参数化测试?
让咱们先从Selenium JUnit
的测试场景开始,若是有个需求想要对一个购物网站执行Selenium
自动化测试。测试人员已经为产品编写了测试用例脚本,可是你很快意识到,不只须要针对不一样的商品,并且还要针对不一样的OS系统和浏览器版本
重复运行用例以确保兼容性。编程
首先,对于Selenium
测试自动化,咱们须要多个数据集合来执行测试。随之而来的是一个跨浏览器矩阵,能够覆盖绝大多数用户的实际状况。其次,咱们须要学习如何编写测试脚本从已存储的数据集中获取数据。浏览器
值得关注的是,在对Web应用程序
进行自动化测试时,很难为后续的测试迭代维护单个稳定可靠的数据源。除非是特殊基础数据以及一些极少变动的业务场景,更多的时候咱们很难建立用于相同配置的同一测试用例的多个Selenium
测试自动化脚本。简而言之,硬编码只会带来大量的维护工做,所以须要JUnit参数化测试来帮助您节省Selenium
测试自动化周期中的时间和精力。微信
为了在咱们的Selenium
测试自动化脚本中使用多个数据集,首先想到的是使用Excel
工做表来获取该数据。可是,在打算建立更具体的Selenium
测试自动化脚本的状况时,就须要使用像JUnit
这样的多合一框架。JUnit
使咱们可以以更健壮的方式编写测试用例,并使咱们拥有多种功能,其中之一就是参数化。app
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 + "\n");
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 + "\n");
String title = driver.getTitle();
System.out.println("The title is : " +title);
System.out.println("----结束----");
driver.quit();
}
}
在下一步中,我将建立一个带有@RunWith
注解的类。此类将在新实例上运行测试。除此以外,我还将为此类建立一个构造函数,该构造函数将存储要测试的数据。
在此示例中,两个变量将传递给此构造函数。接下来,要生成并返回测试数据,我将建立一个静态方法,其返回类型为Collection
。此集合的每一个条目将给出一次运行的数据,例如Selenium
、FunTester
等等,将是一次执行的数据。
此方法的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) + "\n"); 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热文精选
本文分享自微信公众号 - FunTester(NuclearTester)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。