在執行自動化測試用例的時候,我們需要自動判斷用例執行完成后獲得的輸出值是否與預期值一致,這個時候就需要用到斷言功能。
TestNG中提供了一個Assert類:org.testng.Assert,該類繼承了:java.lang.Object類。從TesNG的官方文檔中,我們可以看到,org.testng.Assert類是作為放置一系列斷言的靜態方法的容器。這些斷言方法基本上是有2個或三個輸入參數,參數的順序是 actualValue(實際值), expectedValue(期望值) [, message(信息)].
在實際的測試工作中我們經常用到的斷言方法有:assertEquals方法。該方法可以判斷 actualValue(實際值)與expectedValue(期望值)是否一致,如果兩者不一致,則會拋出 java.lang.AssertionError錯誤,打印出message(如果參數中有message的話),並跳出這個測試方法。我們可以通過一段簡單的代碼來看看這種情況。代碼如下:
1 import org.testng.Assert; 2 import org.testng.annotations.Test; 3 4 public class TestAssertion { 5 6 @Test 7 public void testAssertEquals(){ 8 System.out.println("before test"); 9 Assert.assertEquals(1,2,"Not equals: "); 10 System.out.println("after test"); 11 } 12 }
運行結果如下:
before test FAILED: testAssertEquals java.lang.AssertionError: Not equals: expected [2] but found [1] at org.testng.Assert.fail(Assert.java:94) at org.testng.Assert.failNotEquals(Assert.java:494) at org.testng.Assert.assertEquals(Assert.java:123) at org.testng.Assert.assertEquals(Assert.java:370) at testNGtest.TestAssertion.testAssertEquals(TestAssertion.java:11) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84) at org.testng.internal.Invoker.invokeMethod(Invoker.java:714) at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901) at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231) at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127) at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111) at org.testng.TestRunner.privateRun(TestRunner.java:767) at org.testng.TestRunner.run(TestRunner.java:617) at org.testng.SuiteRunner.runTest(SuiteRunner.java:334) at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329) at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291) at org.testng.SuiteRunner.run(SuiteRunner.java:240) at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) at org.testng.TestNG.runSuitesSequentially(TestNG.java:1224) at org.testng.TestNG.runSuitesLocally(TestNG.java:1149) at org.testng.TestNG.run(TestNG.java:1057) at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111) at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204) at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175) =============================================== Default test Tests run: 1, Failures: 1, Skips: 0 ===============================================
可以看到,assertEquals之前的一段代碼 System.out.println("before test")被正常運行,控制台中打印出了 before test 的信息。當代碼運行到 Assert.assertEquals(1,2,"Not equals: ") 這一句時,拋出了java.lang.AssertionError錯誤,並打印了message中的內容。同時可以發現,Assert.assertEquals(1,2,"Not equals: ")后的代碼沒有被運行。這是因為在拋出java.lang.AssertionError錯誤時,就從該測試方法中跳出了。最后該測試方法也被認定執行失敗。
testAssertEquals()方法的傳入參數類型除了JAVA的基礎數據類型之外,還可以傳入如byte數組byte[]、Collection對象、Object對象、Object對象數組等,這個在官網的API手冊中描述的很詳細。需要注意的是,在做數組、集合類的斷言時,只有實際值與期望值中元素內容相同,元素排列的順序也一致,才會斷言是相同的,否則會拋出錯誤。