干貨!詳解自動化測試用例設計與管理的通用策略(基于TestNg)
自動化測試的用例設計通用策略
我們在做自動化測試時,是需要對用例進行管理的,比較常用的方案是(以java為例)
- 一個project對應一個產(chǎn)品;
- 一個package對應產(chǎn)品中的一個模塊;
- 一個class對應模塊中的一個場景;
- 一個測試方法對應場景中的一個測試點;
- 最后,通過suite,定義組織要執(zhí)行的class。
如下圖所示,TestNGDemo定義為一個產(chǎn)品、包com.my.case1、com.my.case2和com.my.case3代表產(chǎn)品中的3個模塊,而MyCase1、MyCase2等6個類代表6個測試場景。
我們可以在類中設計具體的測試點,如下圖所示,類MyCase5中的方法f9和f10代表兩個測試點(基于Testng)
TestNg中用例組織
Testng通過配置文件來對測試用例進行管理,具體規(guī)則如下:
- 一個suite里面可以定義要執(zhí)行的test,可以包括多個test;
- 一個test里面可以定義要執(zhí)行的package和class(可以同時定義package和class,二者是并列關系)
- 一個class可以設置要執(zhí)行的method,具體組織形式如下:
Suite里定義了兩個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
運行結果如下:
com.my.case1包下的類MyCase1和類MyCase2中的所有方法都運行了,f1、f2、f3和f4;
類MyCase4中只運行了方法f7;
類MyCase5中的所有方法都運行了,f9和f10。
TestNG中group的應用
Group的基礎使用
TestNG可以執(zhí)行復雜的測試方法分組進而把測試用例進行分類??梢酝ㄟ^@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可以清晰的看到現(xiàn)有的group結構;
run標簽帶表了需要運行的group信息,我們可以通過include和exclude對需要執(zhí)行的分組和不需要執(zhí)行的分組進行設置,方法非常簡單,如下所示:
- <run>
- <include name="group1" />
- <exclude name="group2" />
- </run>
上圖中通過include來設置運行securitytest組標識的用例。
運行結果如下:可以看到securitytest標簽下的用例都運行了
@BeforeGroups和@AfterGroups的應用
@BeforeGroups注解的方法將在本組內(nèi)任何測試方法執(zhí)行前被執(zhí)行一次,可用于執(zhí)行初始化操作。類似的@AfterGroups 注解的方法將在本組內(nèi)任何測試方法執(zhí)行后被執(zhí)行,可用于關閉資源。@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
的運行前后分別執(zhí)行。