由于在寫自動化測試用例時,自動化的用例中除了有基本的用例步驟以外,還包括了大量的用例執行所形成的數據,而這些數據有可能會影響到之后用例的自動化執行。所以在我們的自動化用例中就包含了大量的清除這些數據的步驟。為了能夠簡化我們的自動化測試用例,使自動化測試步驟執行中形成的數據自動被清除,我們想到了棧。由于自動化測試用例中清除數據的步驟剛好符合"先進后出"的原則,所以我們可以將每一個自動化測試用例的每一個步驟進行壓棧,當這個自動化測試用例執行完之后,所有需要做所有需要做數據清除的步驟都會依次壓棧,當測試用例執行完之后,壓棧的步驟會依次出棧,執行這些步驟對應的數據清除的相應地操作。
棧又名堆棧,它是一種線性表,這種線性表僅允許在表的一端進行插入和刪除的操作。能夠進行插入和刪除操作的這一端叫棧頂,那么這個線性表的另一端就叫做棧尾。向一個棧插入新的元素叫做進棧,入?;蛘邏簵?,入棧是將新的元素放到當前棧頂元素的上面,使新的元素成為入棧之后的新的棧頂元素。從一個棧刪除元素又叫做出?;蛘咄藯?,出棧是將棧頂元素刪除掉使相鄰的元素成為新的棧頂元素。關于棧的出棧和入棧請看如下的圖 1 和圖 2.
依次入棧 A, B, C, D
在自動化測試用例執行的過程中,由于一個測試用例執行完成之后對測試環境中的數據做了部分的修改,為了不影響其它測試用例執行,我們每一個自動化測試用例最后執行的 clean up 則是清除當前測試用例對測試環境數據的修改。我們把這一部分清楚修改數據的操作步驟叫做測試用例的 clean up.
本文我們以 java 語言為例,在使用棧之前我們首先要定義棧的類,以及棧中的一些具體操作的實現,由于需要壓棧的是測試用例中的每一個具體的方法實現,再利用 java 的反射機制映射對應的具體方法。我們將這些方法的對象稱之為棧中的元素,在本文中我們將棧中的每一個元素的定義類命名為 StackVo, 所以在 StackVo 類中主要包含方法的一些基本參數。本文中對棧定義的類命名為 CleanUpStack. CleanUpStack 類中主要包含了棧的一些基本的操作。簡單的講,CleanUpStack 就是一個棧體, 而 StackVo 就是入棧的元素,每一個 StackVo 就是測試用例中需要做 clean up 操作的方法。關于 StackVo 類和 CleanUpStack 類的具體定義請看如下圖 3 和圖 4.
在講解用棧實現 clean up 之前,為了便于理解整個流程,我們首先給大家介紹一下 JBehave 自動化測試用例的書寫,在 JBehave 中一個 scenario 就相當于一個 test case, 一個 story 就相當于一個 suite. 測試用例可以根據功能以及設計的不同書寫在不同的 story 文件里。它們的對應關系如圖 5.
JBehave 自動化測試用例中一個 story 文件中可以包含很多個 scenarios,同時 story 文件中也包含很多的關鍵字,下邊本文會對這些關鍵字依次做介紹
1
2
3
4
5
6
7
8
9
10
|
Feature:對 story 文件中功能或者測試用例的描述。 Narrative:對功能以及測試用例的描述。 Background:預先處理的步驟都會放在 Background 中,Background 的步驟是在 scenario 之前執行。 Tags: 像圖 6 中的@bct,@a, @bl 就是一個 scenario 的 tags,這個 tags 用于過濾測試用例,可以自己來定義。 Scenario: 一個測試用例標實,后邊可以寫測試用例的名字。 @Given:一個事件的先決條件步驟。 @When: 事件發生的步驟。 @Then: 事件結果驗證步驟。 @BeforeScenario/@AfterScenario: 一個 scenario 之前或者之后需要執行的方法。 @BeforeStory/@AfterStory: 一個 story 之前或者之后需要執行的方法。 |
在 2.1 章節中我們已經介紹了 JBehave 測試用例的書寫,在這一章節我們介紹一下 JBehave 對一步測試用例的實現。如下圖 7 所示。
下面本文將以具體的 JBehave 的自動化測試用例為例來說明用棧來實現 clean up 的整個流程。首先我們使用一個圖來說明整個的流程,并且對該圖依次進行闡述以方便大家理解。如圖 5 所示,此圖中以一個非常簡單的測試用例來闡述在測試用例執行的過程中如何創建棧的對象,什么時候入棧,什么時候出棧。
圖 8 中標注的數字則為整個流程中的步驟順序。在 JBehave 自動化測試用例中, 本文將按照這個簡單的測試用例來講解棧實現 clean up 的原理。
在每一個 scenario 開始執行前,最先執行 beforeScenario 方法中的方法體,每一個 scenario 中所有步驟都是在同一個線程中執行的。CleanUpStack 的對象就是在這一步創建的。
在第二步中,當前的測試用例要創建一個 BE, 由于 create 的步驟是需要做 clean up 操作的,那么在創建完 BE 之后,我們還會創建一個棧的元素 StackVo,并且用 delete 方法參數構建一個完整的 StackVo 對象,并且將這個對象壓棧。
在第三步中同樣也是 create 的步驟,這一步也是需要做 clean up,那么在創建完 Issue 之后我們仍然會創建一個元素 StackVo, 并且用 delete 方法參數構建一個完整的 StackVo 對象,并且將這個對象壓棧。
第四部這個測試用例的所有步驟已經執行完成,最后執行 afterScenario 方法中的方法體,在這個方法體中步驟執行完后我們會去檢查當前 CleanUpStack 棧對象中是否為空,如果為空則不做任何的處理,如果不為空則將棧中的元素依次出棧,在出棧的時候利用 java 的反射原理機制一次執行對應的棧元素對應的方法。這樣就完成了自動的 clean up.
通過對本文的閱讀,相信大家對棧以及如何使用棧的思想實現自動化測試用例的 clean up 有了非常清楚的認識。在編寫自動化測試用例的過程中對棧的靈活應用使得我們的自動化測試用例步驟得到了精簡,為自動化測試人員節省了編寫 clean up 步驟的工作量,大大的提高了自動化測試用例的編寫。
原文轉自:https://www.ibm.com/developerworks/cn/java/j-us-sta-th-te-ca-f-cl-up/