5 - Test methods, Test classes and Test groups
5.1 - Test groups
TestNG容許執行復雜的測試方法分組。不僅可以申明方法屬于組,而且可以指定分組包含其他分組。
然后TestNG可以被調用,并被要求包含某些分組和排除其他的分組。
這將提供怎樣劃分測試的最大彈性,并且如果想運行兩個不同的測試裝置不需要重新編譯。
例如,非常普遍的需要至少兩個種類的測試
* Check-in tests. 這些測試將在提交新代碼之前運行. 它們典型的被要求快速而且僅僅確認沒有基礎功能被破壞。
* Functional tests. 這些測試將覆蓋所有的軟件功能,并且必須運行至少1天,盡管理想的是連續運行.
代表性的,check-in測試是功能性測試的子集。TestNG容許用非常直接的方式說明這個。
例如: 可以這樣構造測試,申明完整的測試類屬于"functest"組,另外兩個方法屬于組"checkintest":
public class Test1 {
@Test(groups = { "functest", "checkintest" })
public void testMethod1() {
}
@Test(groups = {"functest", "checkintest"} )
public void testMethod2() {
}
@Test(groups = { "functest" })
public void testMethod3() {
}
}
調用TestNG,使用
<test name="Test1">
<groups>
<run>
<include name="functest"/>
</run>
</groups>
<classes>
<class name="example1.Test1"/>
</classes>
</test>
將運行在類中的所有測試方法,如果使用checkintest調用則將只運行testMethod1()和testMethod2().
這里由其他例子,這次使用正則表達式。假設某些測試方法可能無法在Linux上運行,測試將是類似如此:
@Test
public class Test1 {
@Test(groups = { "windows.checkintest" })
public void testWindowsOnly() {
}
@Test(groups = {"linux.checkintest"} )
public void testLinuxOnly() {
}
@Test(groups = { "windows.functest" )
public void testWindowsToo() {
}
}
你可以使用下面的testng.xml文件只啟動Windows方法:
<test name="Test1">
<groups>
<run>
<include name="windows.*"/>
</run>
</groups>
<classes>
<class name="example1.Test1"/>
</classes>
</test>
注意:TestNG使用正則表達,而不是wildmats。注意這個差別。
Method groups
同樣可以包含或排除個別方法:
<test name="Test1">
<classes>
<class name="example1.Test1">
<methods>
<include name=".*enabledTestMethod.*"/>
<exclude name=".*brokenTestMethod.*"/>
</methods>
</class>
</classes>
</test>
這在需要使莫個單獨的方法失效而不想重新編譯時非常方便,但是不建議太多的使用這個機制,因為這將可能破壞你的測試框架 如果你開始重構你的java代碼(標簽中使用的正則表達式可能不再匹配你的方法)
5.2 - Groups of groups
"functest" itself will contain the groups "windows" and "linux" while "checkintest will only contain "windows". Here is how you would define this in your property file:
組可以包含其他組。這些組被稱為"MetaGroups"。例如,你可能想定義一個"all"組,包括"checkintest"和"functest"。"functest"自身將包含組 "windows" 和 "linux",而"checkintest"將包含"windows".
<test name="Regression1">
<groups>
<define name="functest">
<include name="windows"/>
<include name="linux"/>
</define>
<define name="all">
<include name="functest"/>
<include name="checkintest"/>
</define>
<run>
<include name="all"/>
</run>
</groups>
<classes>
<class name="test.sample.Test1"/>
</classes>
</test>
5.3 - Exclusion groups
TestNG 容許包含組也容許排除組.
例如,當由因為最近的修改而臨時破壞的測試而又沒有時間去修復它們時非常有用。無論如何,你想要干凈的運行功能性測試,因此你想要是這些測試失效,但是記住它們重新被激活。
一個簡單的解決這個問題的方法是創建一個稱為"broken"的組并讓這些測試方法歸屬它。例如,在上面的例子中,我知道testMethod2() 現在被破壞了,所有我想關閉它:
@Test(groups = {"checkintest", "broken"} )
public void testMethod2() {
}
現在我所想要做的只是在運行中排除這個組:
<test name="Simple example">
<groups>
<run>
<include name="checkintest"/>
<exclude name="broken"/>
</run>
</groups>
<classes>
<class name="example1.Test1"/>
</classes>
</test>
用這種方法,我將得到一個干凈的測試運行,同時記錄了那些被破壞并想要后續修復的測試。
注意:你也可以通過使用在@Test and @Before/After annotations上的"enabled"屬性在個體的層面上關閉測試,
5.4 - Partial groups
你可以在類的級別上定義組,然后在方法的層次上添加組:
@Test(groups = { "checkin-test" })
public class All {
@Test(groups = { "func-test" )
public void method1() { ... }
public void method2() { ... }
}
在這個類中,method2() 屬于組"checkin-test",在類的級別定義。而method1() 同時屬于 "checkin-test" 和 "func-test".