自動(dòng)化測試的用例設(shè)計(jì)通用策略
我們?cè)谧鲎詣?dòng)化測試時(shí)涩僻,是需要對(duì)用例進(jìn)行管理的缭召,比較常用的方案是(以java為例)
一個(gè)project對(duì)應(yīng)一個(gè)產(chǎn)品;
一個(gè)package對(duì)應(yīng)產(chǎn)品中的一個(gè)模塊逆日;
一個(gè)class對(duì)應(yīng)模塊中的一個(gè)場景嵌巷;
一個(gè)測試方法對(duì)應(yīng)場景中的一個(gè)測試點(diǎn);
最后室抽,通過suite搪哪,定義組織要執(zhí)行的class。
如下圖所示坪圾,TestNGDemo定義為一個(gè)產(chǎn)品晓折、com.my.case1惑朦、com.my.case2和com.my.case3代表產(chǎn)品中的3個(gè)模塊,而MyCase1漓概、MyCase2等等6個(gè)類代表6個(gè)測試場景
我們可以在類中設(shè)計(jì)具體的測試點(diǎn)漾月,如下圖所示,方法f9和f10代表兩個(gè)測試點(diǎn)(基于Testng)
TestNg中用例組織
Testng通過配置文件來對(duì)測試用例進(jìn)行管理垛耳,具體規(guī)則如下:
一個(gè)suite里面可以定義要執(zhí)行的test栅屏,可以包括多個(gè)
一個(gè)test里面可以定義要執(zhí)行的package和class(可以同時(shí)定義package和class,二者是并列關(guān)系)
一個(gè)class可以設(shè)置要執(zhí)行的method堂鲜,具體組織形式如下:
Suite里定義了兩個(gè)test:Simpletest和advancedtest栈雳;
在Simpletest中定義了要執(zhí)行的package:com.my.case1和class: com.my.case2.MyCase4;
在類MyCase4中定義了要執(zhí)行的方法f7和不執(zhí)行的方法f8缔莲;
在advancedtest中定義了要執(zhí)行的class:com.my. case3.MyCase5
運(yùn)行結(jié)果如下:
com.my.case1包下的類MyCase1和類MyCase2中的所有方法都運(yùn)行了哥纫,f1、f2痴奏、f3和f4蛀骇;
類MyCase4中只運(yùn)行了方法f7;
類MyCase5中的所有方法都運(yùn)行了读拆,f9和f10
TestNG中g(shù)roup的應(yīng)用
Group的基礎(chǔ)使用
TestNG可以執(zhí)行復(fù)雜的測試方法分組進(jìn)而把測試用例進(jìn)行分類擅憔。可以通過@Test(groups = { "組1","組2" })進(jìn)行標(biāo)識(shí)檐晕;
分組可以作用在具體的類和方法上暑诸,作用在類上表示類里的所有方法都屬于該分組;而作用在方法上則表示只有該方法屬于該分組辟灰。
具體代碼如下:
MyCase1類具備smoketest標(biāo)簽
@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標(biāo)簽
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標(biāo)簽
@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標(biāo)簽
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標(biāo)簽
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標(biāo)簽
@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");
}
}
設(shè)置配置文件
其中define標(biāo)簽部分定義了需要的組分類个榕,該部分可以省略,但個(gè)人建議保留芥喇,使用define可以清晰的看到現(xiàn)有的group結(jié)構(gòu)西采;
run標(biāo)簽帶表了需要運(yùn)行的group信息,我們可以通過include和exclude對(duì)需要執(zhí)行的分組和不需要執(zhí)行的分組進(jìn)行設(shè)置继控,方法非常簡單械馆,如下所示:
<run>
??????????????? <include name="group1" />
??????????????? <exclude name="group2" />
?</run>
上圖中通過include來設(shè)置運(yùn)行securitytest組標(biāo)識(shí)的用例。
運(yùn)行結(jié)果如下:可以看到securitytest標(biāo)簽下的用例都運(yùn)行了
@BeforeGroups和@AfterGroups的應(yīng)用
@BeforeGroups注解的方法將在本組內(nèi)任何測試方法執(zhí)行前被執(zhí)行一次湿诊,可用于執(zhí)行初始化操作狱杰。類似的@AfterGroups 注解的方法將在本組內(nèi)任何測試方法執(zhí)行后被執(zhí)行,可用于關(guān)閉資源厅须。@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");
}
}
代碼執(zhí)行如下:可以看到@BeforeGroups和@AfterGroups在組smoketest的運(yùn)行前后分別執(zhí)行仿畸。