testng.xml说明文档(TestNG基本模板、TestNG中配置按顺序执行Case、TestNG中配置组合测试)
注意:1、当在 测试类 中直接单击运行的时候则会用默认的.xml来运行该测试方法;必须在.xml中点击运行的时候则该TestNG.xml才有效
2、在创建TestNG测试类时可以自动生成对应的TestNG.xml文件,在创建类时生成xml文件和手动自己创建的xml文件都有效
testng说明文档:http://testng.org/doc/documentation-main.html
1、基本的testng.xml文档:
<?xml version="1.0" encoding="UTF-8"?> <suite name="Suite" parallel="false"> <!-- <parameter name="usn" value="admin" /> <parameter name="pwd" value="111111" />--> <!-- <listeners> --> <!-- <listener class-name="org.uncommons.reportng.HTMLReporter" /> --> <!-- </listeners> --> <test name="Test" preserve-order="true"> <classes> <!-- <class name="com.gmsd.testcase.Login"/> --> <!-- <class name="com.gmsd.testcase.TestLogin"/> --> <class name="com.gmsd.testcase.TestProduct"/> </classes> </test> <!-- Test --> </suite> <!-- Suite -->
2、TestNG按照顺序执行Case
方法一:不同的类及类中所包含的方法都分别在xml中配置,然后按顺序执行Case,这样可以让不同类中的多个方法都可以按照顺序执行Case
java代码:
public class TestPlan1 extends BrowserOption{ WebDriver dr=null; String url=Demo.getprop("url"); String fcurl=Demo.getprop("fcurl"); String frameid="right_iframe"; MenuJump mj=new MenuJump(); int index=1;//index为sheet页,从0开始 @BeforeMethod public void beforeMethod(){ dr=Init.initchrome(dr); System.out.println("1111111111111111111111111111111111111111111111"); Login.LoginChrom(dr, fcurl); Demo.slp(3000); } @AfterMethod public void afterMethod(){ dr.quit(); //dr.close(); } /** * 添加计划 */ @Test(enabled=true) public void addPlan(){ mj.jumpfinancePlan(dr); mj.jumpfinancePlanT_1(dr); Demo.slp(1000); mj.toFram(dr, frameid); int colNum=2;//第二列 String js="document.getElementById(\'addFinancePlan\').click()"; exeJS(dr, js); Demo.slp(3000); //计划模板名称 Select s_tp=fSelect(dr, By.id("templateSelect")); s_tp.selectByIndex(1); /** * 取参数时可以用多种方式,可以从excel中读取,可以从.properties文件中读取,也可以直接赋值 */ //计划名称 WebElement w_p_name=fFind(dr, By.name("financePlan.name")); w_p_name.clear(); w_p_name.sendKeys(Demo.getExcel(index, 2, colNum)); } }
/** * 更新草稿 */ @Test(enabled=true) public void updatePlanC(){ mj.jumpfinancePlan(dr); Demo.slp(1000); mj.jumpfinancePlanT_1(dr); Demo.slp(1000); toFram(dr, frameid); /** * 进入到修改计划界面(草稿) */ if(!isExist(dr,By.className("datagrid-cell-check "))){//根据第一行的复选框 addPlan(); }else {//有记录时执行修改操作(循环翻看每一页来获得需要修改的产品) //获取显示总页数的那串字符 String Lnum=fFind(dr, By.xpath("//*[@id='planlist']/div[1]/div/div[3]")).findElement(By.xpath("//*[@id='planlist']/div[1]/div/div[3]/table/tbody/tr/td[8]/span")).getText(); // System.out.println(Lnum); String number=Demo.getNUm(Lnum).get(0);//获取总页数 int number1=Integer.parseInt(number);//转换成int类型 //外层循环的是是否要翻页,某一页是否又符合的项,里面再调用对比是否有符合项的循环 for (int i = 0; i < number1; i++) { //获取每一页所有的tr对象 List<WebElement> trs=fFind(dr, By.xpath("//*[@id='planlist']/div[1]/div/div[2]/div[2]/div[2]/table")).findElements(By.tagName("tr")); // System.out.println("aaaaaaa"+trs.size()); WebElement wbtr=Demo.getpoduct(trs, dr, By.className("datagrid-cell "));//获得具体的tr对象 if(wbtr!=null){ if(!wbtr.isSelected()){ wbtr.click();//返回对应的对象并点击选中 }else { System.err.println("选中计划时出错!!"); } break; }else {//执行翻页操作 WebElement btn_next=fFind(dr, By.xpath("//*[@id='planlist']/div[1]/div/div[3]/table/tbody/tr/td[10]/a/span/span")); btn_next.click(); Demo.slp(3000); continue; } } //点击修改计划按钮 String js="document.getElementById(\"updateFinancePlan\").click()"; exeJS(dr, js); Demo.slp(5000); /** * 修改计划界面 */
java代码说明:以上用的是 @BeforeMethod、@AfterMethod这两个注解,指的是在执行每一个测试方法前/后 都执行公共方法,这样的缺点是每当执行一个测试方法时都要重新的登陆,造成反复登陆的缺陷
TestNG.xml中配置:在testng.xml中,可以控制测试用例按顺序执行。 当preserve-order="true"是,可以保证节点下面的方法是按顺序执行的
<?xml version="1.0" encoding="UTF-8"?> <suite name="Suite" parallel="false"> <!-- <parameter name="usn" value="admin" /> <parameter name="pwd" value="111111" />--> <!-- <listeners> --> <!-- <listener class-name="org.uncommons.reportng.HTMLReporter" /> --> <!-- </listeners> --> <test name="Test" preserve-order="true"> <classes> <!--产品相关配置 --> <class name="com.gmsd.testcase.TestProduct"> <methods> <include name="addProduce_x_y"></include> <include name="upProduct"></include> </methods> </class> <!-- 计划相关配置 --> <class name="com.gmsd.testcase.TestPlan1"> <methods> <include name="addPlan"/> <include name="updatePlanC"></include> </methods> </class> </classes> </test> <!-- Test --> </suite> <!-- Suite -->
方法二:用TestNG的组合测试
注意:组合测试时,例如计划修改和更新,更新界面和修改界面的标签的name等属性一般都是保持一致的,所以当用组合测试时,很容易报找不到标签的问题,因为新增界面和修改界面都可以找到该属性值元素,但程序无法正确判断要调用哪一个,所以会出现非组合测试时程序可以正常运行,当组合测试时就会报错误,所以当想用组合测试时在更新界面需要获取上一级的元素对象(这也是分层获取元素对象的好处)然后再获该界面的对应的元素就可以避免该问题出现(参照例子:修改计划和更新计划)
java代码:
public class TestPlan1 extends BrowserOption{ WebDriver dr=null; String url=Demo.getprop("url"); String fcurl=Demo.getprop("fcurl"); String frameid="right_iframe"; MenuJump mj=new MenuJump(); int index=1;//index为sheet页,从0开始 // @BeforeMethod @BeforeGroups(groups={"grps"}) public void beforeMethod(){ dr=Init.initchrome(dr); System.out.println("1111111111111111111111111111111111111111111111"); Login.LoginChrom(dr, fcurl); Demo.slp(3000); mj.jumpfinancePlan(dr); Demo.slp(1000); mj.jumpfinancePlanT_1(dr); Demo.slp(1000); toFram(dr, frameid); } // @AfterMethod @AfterGroups(groups={"grps"}) public void afterMethod(){ dr.quit(); //dr.close(); } /** * 添加计划 */ @Test(enabled=true,groups={"grps"}) public void addPlan(){ // mj.jumpfinancePlan(dr); // mj.jumpfinancePlanT_1(dr); // Demo.slp(1000); // // mj.toFram(dr, frameid); int colNum=2;//第二列 String js="document.getElementById(\'addFinancePlan\').click()"; exeJS(dr, js); Demo.slp(3000); //计划模板名称 Select s_tp=fSelect(dr, By.id("templateSelect")); s_tp.selectByIndex(1); /** * 取参数时可以用多种方式,可以从excel中读取,可以从.properties文件中读取,也可以直接赋值 */ //计划名称 WebElement w_p_name=fFind(dr, By.name("financePlan.name")); w_p_name.clear(); w_p_name.sendKeys(Demo.getExcel(index, 2, colNum)); } }
/** * 更新草稿 */ @Test(enabled=true,groups={"grps"}) public void updatePlanC(){ // mj.jumpfinancePlan(dr); // Demo.slp(1000); // mj.jumpfinancePlanT_1(dr); // Demo.slp(1000); // toFram(dr, frameid); /** * 进入到修改计划界面(草稿) */ if(!isExist(dr,By.className("datagrid-cell-check "))){//根据第一行的复选框 addPlan(); }else {//有记录时执行修改操作(循环翻看每一页来获得需要修改的产品) //获取显示总页数的那串字符 String Lnum=fFind(dr, By.xpath("//*[@id='planlist']/div[1]/div/div[3]")).findElement(By.xpath("//*[@id='planlist']/div[1]/div/div[3]/table/tbody/tr/td[8]/span")).getText(); // System.out.println(Lnum); String number=Demo.getNUm(Lnum).get(0);//获取总页数 int number1=Integer.parseInt(number);//转换成int类型 //外层循环的是是否要翻页,某一页是否又符合的项,里面再调用对比是否有符合项的循环 for (int i = 0; i < number1; i++) { //获取每一页所有的tr对象 List<WebElement> trs=fFind(dr, By.xpath("//*[@id='planlist']/div[1]/div/div[2]/div[2]/div[2]/table")).findElements(By.tagName("tr")); // System.out.println("aaaaaaa"+trs.size()); WebElement wbtr=Demo.getpoduct(trs, dr, By.className("datagrid-cell "));//获得具体的tr对象 if(wbtr!=null){ if(!wbtr.isSelected()){ wbtr.click();//返回对应的对象并点击选中 }else { System.err.println("选中计划时出错!!"); } break; }else {//执行翻页操作 WebElement btn_next=fFind(dr, By.xpath("//*[@id='planlist']/div[1]/div/div[3]/table/tbody/tr/td[10]/a/span/span")); btn_next.click(); Demo.slp(3000); continue; } } //点击修改计划按钮 String js="document.getElementById(\"updateFinancePlan\").click()"; exeJS(dr, js); Demo.slp(5000);
java代码说明:以上用的是 @BeforeGroups、 @AfterGroups这两个注解,@BeforeGroups指的是 被配置的方法将在列表中的gourp前运行。这个方法保证在第一个属于这些组的测试方法调用前立即执行。
@AfterGroups指的是 被配置的方法将在列表中的gourp后运行。这个方法保证在最后一个属于这些组的测试方法调用后立即执行。
该方法 的好处是当执行完该组内所有的测试方法后才会退出操作,避免反复登陆的缺陷
TestNG.xml中配置:在testng.xml中,可以控制测试用例按顺序执行。 可以保证节点下面的方法是按顺序执行的
<?xml version="1.0" encoding="UTF-8"?> <suite name="Suite" parallel="false"> <!-- <parameter name="usn" value="admin" /> <parameter name="pwd" value="111111" />--> <!-- <listeners> --> <!-- <listener class-name="org.uncommons.reportng.HTMLReporter" /> --> <!-- </listeners> --> <test name="Test" preserve-order="true"> <classes> <class name="com.gmsd.testcase.TestPlan1"></class> </classes> <!-- 组合测试 --> <groups> <run> <include name="grps"></include> </run> </groups> </test> <!-- Test --> </suite> <!-- Suite -->