java-testng-selenium优化

由于项目中webui测试的需要,是用testng+selenium的方式,其中遇到过几个问题,记录下,方便以后查看

1.重复运行多次case

因为是selenium,所以有的时候需要运行多次,方法是写一个Retry的类,继承testng的retry类就可以。

public class Retry implements IRetryAnalyzer {
    private int retryCount = 0;
    private int maxRetryCount = 3;

    public boolean retry(ITestResult result) {

        if (retryCount < maxRetryCount) {
            retryCount++;
            System.out.println(String.format("test failed!try %d time!",retryCount+1));
            return true;
        }
        return false;
    }
运行的时候就在case上加上
@Test(retryAnalyzer=Retry.class)
就可以拉

 2.自定义annotions

虽然testng自带有很多注释,很好用,但是在项目中,组长要求在每个case前面能够描述一下这个case的作用,以后当case失败的时候,可以输出这个case的作用和失败原因,要外人不看代码也可以看的懂,所以就想自定义一个annotation,添加个decsription属性。

 1 //UIMessage.java
 2 import static com.myhexin.common.Assert.AssertEquals;
 3 
 4 import java.lang.annotation.Retention;
 5 import java.lang.annotation.RetentionPolicy;
 6 import java.lang.annotation.Target;
 7 import java.lang.annotation.ElementType;
 8 
 9 import org.testng.annotations.Parameters;
10 import org.testng.annotations.Test;
11 @Retention(RetentionPolicy.RUNTIME)
12 @Target({ElementType.METHOD})
13 public @interface UIMessage {
14      String description();
15 }
16 
17 //应用
18 @UIMessage(description = "我是来试试的")@Test(retryAnalyzer=Retry.class)
19 @Parameters()
20 public void testDengLuZhangHao(){
21 /*
22  * 函数体
23  */
24 }    
25 //如何获取annotation的注释消息,我是用反射来获取的
26 
27 Method[] methods=Class.forName("core.Member").getDeclaredMethods();
28             for(Method method:methods)
29            {
30                  if(method.isAnnotationPresent( UIMessage. class))
31                 {
32                      System. out.println(method.getAnnotation( UIMessage. class).desciption());
33                 }
34            }

 3.selenium截图

目前该截图方式当在remote执行selenium时候,我只是在firefox下成功过,ie打死不行,场景是当case运行失败的时候截图,主要是重写下assert,当断言失败时候,截图,直接上,截图的代码

    public  void screenShot(WebDriver driver,int i)
    {
            String dir_name="./pic";
          if (!(new File(dir_name).isDirectory())) {  // 判断是否存在该目录
             new File(dir_name).mkdir();  // 如果不存在则新建一个目录
          }
         
          SimpleDateFormat sdf = new SimpleDateFormat("-HHmmss");
          String time = sdf.format(new Date()); 
         WebDriver augmentedDriver = new Augmenter().augment(driver);
        
          try {
             File screenshot = ((TakesScreenshot)augmentedDriver).getScreenshotAs(OutputType.FILE); // 关键代码,执行屏幕截图,默认会把截图保存到temp目录
             FileUtils.copyFile(screenshot, new File(dir_name + File.separator + i+ time  + ".png"));  // 这里将截图另存到我们需要保存
          } catch (IOException e) {
             e.printStackTrace();
          }
    }

 

 

posted @ 2013-08-21 16:23  夏木友人  阅读(723)  评论(0编辑  收藏  举报