注意: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 -->