干货!详解自动化测试用例设计与管理的通用策略(基于TestNg)

自动化测试的用例设计通用策略

我们在做自动化测试时,是需要对用例进行管理的,比较常用的方案是(以java为例)

一个project对应一个产品;

一个package对应产品中的一个模块;

一个class对应模块中的一个场景;

一个测试方法对应场景中的一个测试点;

最后,通过suite,定义组织要执行的class。

如下图所示,TestNGDemo定义为一个产品、com.my.case1、com.my.case2和com.my.case3代表产品中的3个模块,而MyCase1、MyCase2等等6个类代表6个测试场景

我们可以在类中设计具体的测试点,如下图所示,方法f9和f10代表两个测试点(基于Testng)

TestNg中用例组织

Testng通过配置文件来对测试用例进行管理,具体规则如下:

一个suite里面可以定义要执行的test,可以包括多个

一个test里面可以定义要执行的package和class(可以同时定义package和class,二者是并列关系)

一个class可以设置要执行的method,具体组织形式如下:

Suite里定义了两个test:Simpletest和advancedtest;

在Simpletest中定义了要执行的package:com.my.case1和class: com.my.case2.MyCase4;

在类MyCase4中定义了要执行的方法f7和不执行的方法f8;

在advancedtest中定义了要执行的class:com.my. case3.MyCase5

运行结果如下:

com.my.case1包下的类MyCase1和类MyCase2中的所有方法都运行了,f1、f2、f3和f4;

类MyCase4中只运行了方法f7;

类MyCase5中的所有方法都运行了,f9和f10

TestNG中group的应用

Group的基础使用

TestNG可以执行复杂的测试方法分组进而把测试用例进行分类。可以通过@Test(groups = { "组1","组2" })进行标识;

分组可以作用在具体的类和方法上,作用在类上表示类里的所有方法都属于该分组;而作用在方法上则表示只有该方法属于该分组。

具体代码如下:

MyCase1类具备smoketest标签

@Test(groups = { "smoketest" })

public class MyCase1 {

 @Test

 public void f1() {

    System.out.println("MyCase1 f1");

     assertEquals("a","b");

      }

  @Test

  public void f2() {

   System.out.println("MyCase1 f2");

   assertEquals("a","a");

}

}

MyCase2类只有f3方法具备smoketest标签

public class MyCase2 {

 @Test(groups = { "smoketest" })

 public void f3() {

    System.out.println("MyCase2 f3");

     assertEquals("a","b");

      }

  @Test

  public void f4() {

   System.out.println("MyCase2 f4");

   assertEquals("a","a");

}

}

MyCase3类具备performancetest标签

@Test(groups = { "performancetest" })

public class MyCase3 {

 @Test

 public void f5() {

    System.out.println("MyCase3 f5");

     assertEquals("a","b");

      }

  @Test

  public void f6() {

   System.out.println("MyCase3 f6");

   assertEquals("a","a");

}

}

MyCase4类只有f8方法具备performancetest标签

public class MyCase4 {

 @Test

 public void f7() {

    System.out.println("MyCase4 f7");

     assertEquals("a","b");

      }

  @Test(groups = { "performancetest" })

  public void f8() {

   System.out.println("MyCase4 f8");

   assertEquals("a","a");

}

}

MyCase5类具备securitytest 和performancetest标签

public class MyCase5 {

@Test(groups = { "securitytest","performancetest" })

 public void f9() {

    System.out.println("MyCase5 f9");

     assertEquals("a","b");

      }

  @Test

  public void f10() {

   System.out.println("MyCase5 f10");

   assertEquals("a","a");

}

}

MyCase6类具备securitytest标签

@Test(groups = { "securitytest" })

public class MyCase6 {

 @Test

 public void f11() {

    System.out.println("MyCase6 f11");

     assertEquals("a","b");

      }

  @Test

  public void f12() {

   System.out.println("MyCase6 f12");

   assertEquals("a","a");

}

}

设置配置文件

其中define标签部分定义了需要的组分类,该部分可以省略,但个人建议保留,使用define可以清晰的看到现有的group结构;

run标签带表了需要运行的group信息,我们可以通过include和exclude对需要执行的分组和不需要执行的分组进行设置,方法非常简单,如下所示:

<run>

                <include name="group1" />

                <exclude name="group2" />

 </run>

上图中通过include来设置运行securitytest组标识的用例。

运行结果如下:可以看到securitytest标签下的用例都运行了

@BeforeGroups和@AfterGroups的应用

@BeforeGroups注解的方法将在本组内任何测试方法执行前被执行一次,可用于执行初始化操作。类似的@AfterGroups 注解的方法将在本组内任何测试方法执行后被执行,可用于关闭资源。@Test(groups = { "smoketest" })

public class MyCase1 {

 @BeforeGroups(groups

= { "smoketest" })

 public void setup() {

    System.out.println("smoketest setup");

 }

 @AfterGroups(groups

= { "smoketest" })

 public void teardown() {

    System.out.println("smoketest teardown");

 }

 @Test

 public void f1() {

    System.out.println("MyCase1 f1");

     assertEquals("a","b");

      }

  @Test

  public void f2() {

   System.out.println("MyCase1 f2");

   assertEquals("a","a");

}

}

代码执行如下:可以看到@BeforeGroups和@AfterGroups在组smoketest的运行前后分别执行。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容