依賴注釋
@Test中的dependsOnMethods或dependsOnGroups屬性
這兩種依賴:
- Hard dependencies(硬依賴)
所有的被依賴方法必須成功運行楞泼。只要有一個出問題,測試就不會被調(diào)用,并且在報告中被標記為SKIP疯搅。
- Soft dependencies(軟依賴)
即便是有些依賴方法失敗了开财,也一樣運行肢预。如果你只是需要保證你的測試方法按照順序執(zhí)行臀防,而不關心他們的依賴方法是否成功涛救。那么這種機制就非常有用牧嫉〖粮可以通過添加"alwaysRun=true"
到@Test
來實現(xiàn)軟依賴。
硬依賴的例子:
@Test
public void serverStartedOk() {}
@Test(dependsOnMethods = { "serverStartedOk" })
public void method1() {}
此例中酣藻,method1()
依賴于方法serverStartedOk()
曹洽,從而保證 serverStartedOk()
總是先運行
也可以讓若干方法依賴于組:
@Test(groups = { "init" })
public void serverStartedOk() {}
@Test(groups = { "init" })
public void initEnvironment() {}
@Test(dependsOnGroups = { "init.* })
public void method1() {}
本例中,method1()
依賴于匹配正則表達式"init."
的組,由此保證了serverStartedOk()
和initEnvironment()
總是先于method1()
被調(diào)用辽剧。
如果使用硬依賴送淆,并且被依賴方法失敗(alwaysRun=false,即默認是硬依賴)怕轿,依賴方法則不是被標記為FAIL而是SKIP偷崩。被跳過的方法會被在最后的報告中標記出來(HTML既不用紅色也不是綠色所表示),主要是被跳過的方法不是必然失敗撞羽,所以被標出來做以區(qū)別阐斜。
無論dependsOnGroups
還是dependsOnMethods
都可以接受正則表達式作為參數(shù)。對于dependsOnMethods
诀紊,如果被依賴的方法有多個重載智听,那么所有的重載方法都會被調(diào)用。如果你只希望使用這些重載中的一個,那么就應該使用 dependsOnGroups
另外到推,也可以在的testng.xml文件中指定的組依賴關系考赛。您可以使用<dependencies>標簽來實現(xiàn)這一點:
<test name="My suite">
<groups>
<dependencies>
<group name="c" depends-on="a b" />
<group name="z" depends-on="c" />
</dependencies>
</groups>
</test>
依賴注入
TestNG的支持兩種不同類型的依賴注入:本機(由TestNG的本身執(zhí)行)和外部(通過依賴注入框架,如Guice)
本地依賴注入
TestNG 允許你在自己的方法中聲明額外的參數(shù)莉测。這時颜骤,TestNG會自動使用正確的值填充這些參數(shù)。依賴注入就使用在這種地方:
任何
@Before
或@Test
方法可以聲明一個類型為ITestContext
的參數(shù)捣卤。任何
@After
都可以聲明一個類型為ITestResult
的單數(shù)忍抽,它代表了剛剛運行的測試方法。任何
@Before
和@After
方法都能夠聲明類型為XmlTest
的參數(shù)董朝,它包含了當前的<test>
參數(shù)鸠项。任何
@BeforeMethod
可以聲明一個類型為java.lang.reflect.Method
的參數(shù)。這個參數(shù)會接收@BeforeMethod
完成調(diào)用的時候馬上就被調(diào)用的那個測試方法當做它的值子姜。任何
@BeforeMethod
可以聲明一個類型為Object[]
的參數(shù)祟绊。這個參數(shù)會包含要被填充到下一個測試方法中的參數(shù)的列表,它既可以又 TestNG 注入哥捕,例如java.lang.reflect.Method
或者來自@DataProvider
牧抽。任何
@DataProvider
可以聲明一個類型為ITestContext
或java.lang.reflect.Method
的參數(shù)。后一種類型的參數(shù)遥赚,會收到即將調(diào)用的方法作為它的值扬舒。
可以使用@NoInjection關閉注釋:
public class NoInjectionTest {
@DataProvider(name = "provider")
public Object[][] provide() throws Exception {
return new Object[][] { { CC.class.getMethod("f") } };
}
@Test(dataProvider = "provider")
public void withoutInjection(@NoInjection Method m) {
Assert.assertEquals(m.getName(), "f");
}
@Test(dataProvider = "provider")
public void withInjection(Method m) {
Assert.assertEquals(m.getName(), "withInjection");
}
}
Guice依賴注入
estNG給一個簡單的方法來與Guice模塊注入測試對象:
@Guice(modules = GuiceExampleModule.class)
public class GuiceTest extends SimpleBaseTest {
@Inject
ISingleton m_singleton;
@Test
public void singletonShouldWork() {
m_singleton.doSomething();
}
}
在這個例子中,GuiceExampleModule
被預期綁定到ISingleton
接口的一些具體的類:
public class GuiceExampleModule implements Module {
@Override
public void configure(Binder binder) {
binder.bind(ISingleton.class).to(ExampleSingleton.class).in(Singleton.class);
}
}
如果在指定的模塊實例化你的測試類需要更多的靈活性凫佛,可以指定一個模塊工廠:
@Guice(moduleFactory = ModuleFactory.class)
public class GuiceModuleFactoryTest {
@Inject
ISingleton m_singleton;
@Test
public void singletonShouldWork() {
m_singleton.doSomething();
}
}
模塊工廠需要實現(xiàn)該IModuleFactory
接口:
public interface IModuleFactory {
/**
* @param context The current test context
* @param testClass The test class
*
* @return The Guice module that should be used to get an instance of this
* test class.
*/
Module createModule(ITestContext context, Class<?> testClass);
}
工廠將會通過了測試環(huán)境和TestNG需要實例化測試類的一個實例讲坎。
createModule
方法應該返回一個Guice模塊,就會知道如何實例化這個測試類愧薛∫赂希可以使用測試環(huán)境,以了解環(huán)境的詳細信息厚满,如在規(guī)定的testng.xml設置參數(shù)等...