使用異步方式提高測試腳本運行效率
優化測試腳本中,提高效率是主要目的之一,但是往往效率提升是最難的,因為無從下手。但其實我們平時的測試腳本中有一部分是很容易優化提升效率的,那就是I/O部分。我們常規的做法是在腳本運行前使用JUnit的@Before或者@BeforeClass來進行各種I/O操作,例如讀寫數據庫、讀寫磁盤文件等,很多時候是為了準備測試數據,這些預置條件花費的時間常常比整個腳本的運行時間都要長,如果能縮短這部分操作的時間,那么效率很得到很大的提升。
優化的方法很簡單,就是將這部分操作異步處理。以數據準備為例,我們最常見的做法是將數據保存在excel中,然后讀取excel后再插入數據庫,這里就涉及一次磁盤I/O和一次網絡I/O,但是準備出來的數據一般并不是在測試腳本的第一步就會被用到,所以可以把預置條件異步執行,與測試腳本并行執行,再需要預置條件處理結果的時候再去獲取。
下面我用一個頁面自動化腳本為例來介紹如何提高這部分操作的效率,這段代碼用來校驗淘寶交易過程中的付款環節,既然是校驗付款,那么在預置條件中應該要準備一個未付款狀態的訂單數據。
優化前我們的腳本如下:
Java代碼
1.import java.util.concurrent.ExecutionException; 2.import java.util.concurrent.TimeoutException; 3. 4.import org.junit.Before; 5.import org.junit.Test; 6. 7. 8.public class AsyncSample { 9. 10. private long orderId; 11. 12. @Before 13. public void createOrder() { 14. //準備訂單數據 15. orderId = 0L; //賦值準備好的訂單號 16. } 17. 18. @Test 19. public void test() throws InterruptedException, ExecutionException, TimeoutException { 20. //步驟一:登錄頁面 21. //步驟二:打開已買到訂單頁面 22. //步驟三:根據訂單號定位頁面元素位置 23. //步驟四:付款 24. //斷言:驗證付款結果 25. } 26. 27.} |
上面的腳本中,最耗時的應該在@Before的createOrder方法中,下面來優化這個方法。
Java代碼
1.import java.util.concurrent.Callable; 2.import java.util.concurrent.ExecutionException; 3.import java.util.concurrent.ExecutorService; 4.import java.util.concurrent.Executors; 5.import java.util.concurrent.Future; 6.import java.util.concurrent.TimeUnit; 7.import java.util.concurrent.TimeoutException; 8. 9.import org.junit.AfterClass; 10.import org.junit.Before; 11.import org.junit.Test; 12. 13. 14.public class AsyncSample { 15. 16. private static final ExecutorService single = Executors.newSingleThreadExecutor(); 17. 18. private Future<Long> future; 19. 20. @Before 21. public void createOrder() { 22. future = single.submit(new Callable<Long>() { 23. 24. @Override 25. public Long call() throws Exception { 26. long orderId = 0L; 27. //準備訂單數據 28. return orderId; //返回訂單ID 29. } 30. }); 31. } 32. 33. @AfterClass 34. public static void shutdown() { 35. single.shutdownNow(); 36. } 37. 38. @Test 39. public void test() throws InterruptedException, ExecutionException, TimeoutException { 40. //步驟一:登錄頁面 41. //步驟二:打開已買到訂單頁面 42. long orderId = future.get(10, TimeUnit.SECONDS); //步驟三:從異步任務中獲取訂單號 43. //步驟四:根據訂單號定位頁面元素位置 44. //步驟五:付款 45. //斷言:驗證付款結果 46. } 47. 48.} |
為了清楚的說明方法,并沒有寫太多的代碼,都以注釋說明取代。可以看到在步驟三時才需要預置條件中準備的測試數據,但是正常情況下,在登錄和打開已買到頁面的過程中,訂單數據已經準備好了,步驟三可以直接拿到訂單號然后繼續后面的步驟。
相比原來的腳本,我們充分利用了登錄和打開頁面這段時間完成了數據準備的工作,所以整個數據準備的時間完全沒有了,腳本效率提升是非常明顯的。
當然,也可以將異步的方法作一些封裝使其更簡潔和易用。另外,對于異步方法的使用需要把握好度,避免大量使用降低代碼的可讀性和可維護性。
posted on 2013-06-05 10:31 順其自然EVO 閱讀(327) 評論(0) 編輯 收藏 所屬分類: selenium and watir webdrivers 自動化測試學習