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 -->

  

 

 

 

 

 

posted on 2015-11-24 18:27  小果子  阅读(1136)  评论(0编辑  收藏  举报