測試是一個過程,在這個過程中,應用程式從不同的角度進行,以便-;
- Find the list of issues
- Find differences between the expected and actual result, output, states, etc.
- Understand the implementation phase.
- Find the application useful for realistic purposes.
測試的目標不是讓開發人員犯錯,而是提供工具並提高質量,以便在給定的時間估計應用程式的運行狀況。
測試需要提前計劃。這就要求定義測試的目的,理解測試用例的範圍,列出業務需求,並意識到項目不同階段所涉及的風險。
測試定義爲一系列要在系統或應用程式上驗證的方面。以下是常見測試方法的列表;
單元測試通常由開發人員自己執行。其目的是檢查代碼單元是否按預期工作。
可用性測試−開發人員通常會忘記他們正在爲不了解系統的最終用戶編寫應用程式。可用性測試驗證了產品的優缺點。
功能/驗收測試−當可用性測試檢查應用程式或系統是否可用時,功能測試確保每個指定的功能都已實現。
進行負載和性能測試−是爲了了解系統是否能夠適應要進行的負載和性能測試。這可能導致硬體更改、優化SQL查詢等。
回歸測試−它驗證產品的連續發布不會破壞以前的任何功能。
可靠性和彈性測試&負;可靠性測試有助於在一個或多個組件出現故障時驗證系統應用程式。
Unit Testing
Photoblog應用程式經常使用單元測試來檢查以下各項;
- New functionalities work correctly and as expected.
- Existing functionalities are not broken by new code release.
- Defects are fixed and remain fixed.
Python附帶了一個標準的unittest模塊,提供了不同的單元測試方法。
Unittest
unit test源於JUnit,一個由Kent Beck和Erich Gamma開發的Java單元測試包。單元測試只返回定義的數據。可以定義模擬對象。這些對象允許對我們設計的接口進行測試,而不必依賴於整個應用程式。它們還提供了在隔離模式下運行包含其他測試的測試的方法。
讓我們用以下方式定義一個虛擬類−
import unittest class DummyTest(unittest.TestCase): def test_01_forward(self): dummy = Dummy(right_boundary=3) self.assertEqual(dummy.forward(), 1) self.assertEqual(dummy.forward(), 2) self.assertEqual(dummy.forward(), 3) self.assertRaises(ValueError, dummy.forward) def test_02_backward(self): dummy = Dummy(left_boundary=-3, allow_negative=True) self.assertEqual(dummy.backward(), -1) self.assertEqual(dummy.backward(), -2) self.assertEqual(dummy.backward(), -3) self.assertRaises(ValueError, dummy.backward) def test_03_boundaries(self): dummy = Dummy(right_boundary=3, left_boundary=-3,allow_negative=True) self.assertEqual(dummy.backward(), -1) self.assertEqual(dummy.backward(), -2) self.assertEqual(dummy.forward(), -1) self.assertEqual(dummy.backward(), -2) self.assertEqual(dummy.backward(), -3)
代碼的解釋如下所示;
應導入unit test模塊,以便爲給定類提供單元測試功能。
類應該通過子類unittest創建。
上面代碼中的每個方法都以單詞測試開始。所有這些方法都由unittest處理程序調用。
測試用例調用assert/fail方法來管理異常。
將此視爲運行測試用例的一個示例−
if __name__ == '__main__': unittest.main()
運行測試用例的結果(輸出)如下所示;
---------------------------------------------------------------------- Ran 3 tests in 0.000s OK
Functional Testing
一旦應用程式功能按照需求開始成形,一組功能測試就可以驗證應用程式關於規範的正確性。然而,測試應該自動化,以獲得更好的性能,這將需要使用第三方產品,如硒。
CherryPy提供了類似helper類的內置函數,以簡化函數測試的編寫。
Load Testing
根據您正在編寫的應用程式和您對卷的期望,您可能需要運行負載和性能測試,以便檢測應用程式中阻止其達到某個性能級別的潛在瓶頸。
本節將不詳細說明如何進行性能或負載測試,因爲它不在FunkLoad包中。
FunkLoad最基本的例子如下所示;
from funkload.FunkLoadTestCase import FunkLoadTestCase class LoadHomePage(FunkLoadTestCase): def test_homepage(self): server_url = self.conf_get('main', 'url') nb_time = self.conf_getInt('test_homepage', 'nb_time') home_page = "%s/" % server_url for i in range(nb_time): self.logd('Try %i' % i) self.get(home_page, description='Get gome page') if __name__ in ('main', '__main__'): import unittest unittest.main()
下面是對上述代碼的詳細解釋;
測試用例必須繼承自FunkLoad test case類,這樣FunkLoad就可以完成跟蹤測試期間發生的事情的內部工作。
類名很重要,因爲FunkLoad將根據類名查找文件。
設計的測試用例可以直接訪問配置文件。只需對伺服器調用Get()和post()方法即可獲得響應。