測試執行緒應用程式


在本章中,我們將學習執行緒應用程式的測試。也將學習測試的重要性。

為什麼要測試?

在我們深入討論測試的重要性之前,需要知道什麼是測試。 一般來說,測試是一種發現某件事情如何發揮作用的技術。 另一方面,特別是如果談論計算機程式或軟體,那麼測試就是存取軟體程式功能的技術。

在本節中,我們將討論軟體測試的重要性。 在軟體開發中,在向用戶端發布軟體之前必須進行雙重檢查。 這就是為什麼經驗豐富的測試團隊測試軟體非常重要。 從以下幾點來理解軟體測試的重要性 -

1. 提高軟體品質
當然,沒有公司想要提供低品質的軟體,也沒有客戶想要購買低品質的軟體。 測試通過查詢並修復其中的錯誤來提高軟體的品質。

2. 客戶滿意度
任何企業最重要的部分是客戶的滿意度。 通過提供無錯誤和高品質的軟體,公司可以實現客戶滿意度。

3. 減少新功能的影響
假設我們已經製作了10000行的軟體系統,並且我們需要新增一個新功能,那麼開發團隊就會擔心這個新功能對整個軟體的影響。 在這裡,測試也起著至關重要的作用,因為如果測試團隊已經完成了一套很好的測試,那麼它可以幫助我們避免任何潛在的災難性休息。

4. 使用者體驗
任何業務中另一個最重要的部分是該產品使用者的體驗。 只有測試才能確保終端使用者發現使用該產品簡單易用。

5. 削減開支
測試可以通過在測試開發的測試階段找到並修復錯誤而不是在交付後修復軟體來降低軟體的總成本。 如果在交付軟體後出現重大缺陷,那麼就費用和無形成本而言,例如客戶不滿意度,公司負面聲譽等方面,它會增加其有形成本。

要測試什麼?

總是建議對要測試的內容有適當的知識。 在本節中,我們將首先了解測試任何軟體時測試人員的主要動機。 應該避免使用程式碼覆蓋率,即測試套件在測試時碰到多少行程式碼。 這是因為,在測試時,只關注程式碼行數量並不會增加系統的實際價值。 可能存在一些錯誤,即使在部署之後,稍後也會反映出來。

考慮以下與測試內容相關的重要問題 -

  • 需要關注測試程式碼的功能而不是程式碼覆蓋。
  • 需要首先測試程式碼中最重要的部分,然後轉向程式碼中不太重要的部分。這肯定會節省時間。
  • 測試儀必須有多種不同的測試,可以將軟體推到極限。

測試並行軟體程式的方法

由於利用多核架構的真實能力,並行軟體系統正在取代順序系統。 最近,從手機到洗衣機,從汽車到飛機等,所有的並行系統程式都在使用。需要更加小心地測試並行軟體程式,因為如果為單執行緒應用程式新增了多個執行緒, 已經是一個錯誤,那麼最終會遇到多個錯誤。

並行軟體程式的測試技術主要集中在選擇交錯方面,這些交錯方式暴露了潛在的有害模式,如競態條件,死鎖和原子性違規。 以下是測試並行軟體程式的兩種方法 -

系統的探索
這種方法旨在盡可能廣泛地探索交織的空間。 這些方法可以採用強力技術,而其他方法則採用部分降階技術或啟發式技術來探索交織的空間。

屬性驅動

屬性驅動方法依賴於觀察到並行錯誤更有可能發生在交錯之下,這些交錯揭示了諸如可疑記憶體存取模式之類的特定屬性。 不同的財產驅動方法針對不同的故障,如競態條件,死鎖和違反原子性,這進一步取決於一個或其他特定屬性。

測試策略

測試策略也被稱為測試方法。 該策略定義了如何進行測試。 測試方法有兩種技術 -

主動
儘早開始測試設計過程以便在建立構建之前查詢並修復缺陷的方法。

反應
直到完成開發過程才開始測試的方法。

在對python程式應用任何測試策略或方法之前,我們必須對軟體程式可能存在的錯誤型別有一個基本的想法。 錯誤如下 -

語法錯誤
在程式開發過程中,可能會出現很多小錯誤。 錯誤主要是由於輸入錯誤。 例如,缺少冒號或關鍵字的拼寫錯誤等。這些錯誤是由於程式語法中的錯誤,而不是邏輯中的錯誤。 因此,這些錯誤被稱為語法錯誤。

語意錯誤
語意錯誤也被稱為邏輯錯誤。 如果軟體程式中存在邏輯或語意錯誤,則該語句將編譯並正確執行,但由於邏輯不正確,它不會給出所需的輸出。

單元測試

這是測試python程式最常用的測試策略之一。 該策略用於測試程式碼的單元或元件。 我們指單位或元件代表程式碼的類別或功能。 單元測試通過測試「小」單元來簡化大型程式設計系統的測試。 在上述概念的幫助下,單元測試可以被定義為一種方法,其中對原始碼的各個單元進行測試以確定它們是否返回期望的輸出。

在接下來的章節中,我們將學習單元測試的不同Python模組。

unittest模組

單元測試的第一個模組是unittest模組。 它受JUnit的啟發,預設包含在Python3.6中。 它支援測試自動化,共用測試的設定和關閉程式碼,將測試集合到集合中,以及測試獨立於報告框架。

以下是unittest模組支援的一些重要概念

文字夾具
它用於設定測試,以便在測試結束後可以在開始測試和拆卸之前執行測試。 它可能涉及在開始測試之前建立臨時資料庫,目錄等。

測試用例
測試用例檢查所需的響應是否來自特定的一組輸入。 unittest模組包含一個名為TestCase的基礎類別,可用於建立新的測試用例。 它包括兩個預設方法 -

  • setUp() - 在鍛鍊之前設定測試夾具的勾點方法。 這在呼叫實現的測試方法之前呼叫。
  • tearDown() - 在類中執行所有測試之後解構類裝置的勾點方法。

測試套件
它是測試套件,測試用例或兩者的集合。

測試執行
它控制測試用例或套裝的執行並向使用者提供結果。 它可以使用GUI或簡單的文字介面來提供結果。

以下Python程式使用unittest模組來測試名為Fibonacci的模組。 該計劃有助於計算一個數位的斐波那契數列。 在這個例子中,我們建立了一個名為Fibo_test類,通過使用不同的方法來定義測試用例。 這些方法從unittest.TestCase繼承。 我們使用兩個預設方法 - setUp()tearDown()。 也定義了testfibocal方法。 測試名稱必須以字母測試開始。 在最後的塊中,unittest.main()為測試指令碼提供了一個命令列入口。

import unittest
def fibonacci(n):
   a, b = 0, 1
   for i in range(n):
   a, b = b, a + b
   return a
class Fibo_Test(unittest.TestCase):
   def setUp(self):
   print("This is run before our tests would be executed")
   def tearDown(self):
   print("This is run after the completion of execution of our tests")

   def testfibocal(self):
   self.assertEqual(fib(0), 0)
   self.assertEqual(fib(1), 1)
   self.assertEqual(fib(5), 5)
   self.assertEqual(fib(10), 55)
   self.assertEqual(fib(20), 6765)

if __name__ == "__main__":
   unittest.main()

當從命令列執行時,上面的指令碼產生一個看起來像這樣的輸出 -

This runs before our tests would be executed.
This runs after the completion of execution of our tests.
.
----------------------------------------------------------------------
Ran 1 test in 0.006s
OK

現在,為了更清楚一點,修改上面的程式碼,這有助於定義斐波那契模組。

以下面的程式碼塊為例 -

def fibonacci(n):
   a, b = 0, 1
   for i in range(n):
   a, b = b, a + b
   return a

程式碼塊的一些更改如下所示 -

def fibonacci(n):
   a, b = 1, 1
   for i in range(n):
   a, b = b, a + b
   return a

現在,使用更改後的程式碼執行指令碼後,將得到以下輸出 -

This runs before our tests would be executed.
This runs after the completion of execution of our tests.
F
======================================================================
FAIL: testCalculation (__main__.Fibo_Test)
----------------------------------------------------------------------
Traceback (most recent call last):
File "unitg.py", line 15, in testCalculation
self.assertEqual(fib(0), 0)
AssertionError: 1 != 0
----------------------------------------------------------------------
Ran 1 test in 0.007s

FAILED (failures = 1)

以上輸出顯示模組未能提供所需的輸出。

Docktest模組

docktest模組也有助於單元測試。 它也預裝python。 它比單元測試模組更容易使用。 unittest模組更適合於複雜的測試。要使用doctest模組,可以直接匯入它。 相應函式的文件字串必須具有互動式python對談及其輸出。

如果程式碼中一切正常,那麼docktest模組將不會有輸出; 否則,它會提供輸出。

範例

以下Python範例使用docktest模組來測試名為Fibonacci的模組,該模組有助於計算數位的斐波那契數列。

import doctest
def fibonacci(n):
   """
   Calculates the Fibonacci number

   >>> fibonacci(0)
   0
   >>> fibonacci(1)
   1
   >>> fibonacci(10)
   55
   >>> fibonacci(20)
   6765
   >>>

   """
   a, b = 1, 1
   for i in range(n):
   a, b = b, a + b
   return a
      if __name__ == "__main__":
   doctest.testmod()

可以看到名為fib的相應函式的文件字串具有互動式python對談和輸出。 如果程式碼沒有問題,那麼doctest模組將不會有輸出。 但要了解它的工作原理,我們可以使用-v選項執行它。

(base) D:\ProgramData>python dock_test.py -v
Trying:
   fibonacci(0)
Expecting:
   0
ok
Trying:
   fibonacci(1)
Expecting:
   1
ok
Trying:
   fibonacci(10)
Expecting:
   55
ok
Trying:
   fibonacci(20)
Expecting:
   6765
ok
1 items had no tests:
   __main__
1 items passed all tests:
4 tests in __main__.fibonacci
4 tests in 2 items.
4 passed and 0 failed.
Test passed.

現在,我們將更改幫助定義斐波那契模組的程式碼,以下面的程式碼塊為例 -

def fibonacci(n):
   a, b = 0, 1
   for i in range(n):
   a, b = b, a + b
   return a

以下程式碼塊有助於更改 -

def fibonacci(n):
   a, b = 1, 1
   for i in range(n):
   a, b = b, a + b
   return a

在執行指令碼後,即使沒有-v選項,使用更改後的程式碼,我們將得到如下所示的輸出。

(base) D:\ProgramData>python dock_test.py
**********************************************************************
File "unitg.py", line 6, in __main__.fibonacci
Failed example:
   fibonacci(0)
Expected:
   0
Got:
   1
**********************************************************************
File "unitg.py", line 10, in __main__.fibonacci
Failed example:
   fibonacci(10)
Expected:
   55
Got:
   89
**********************************************************************
File "unitg.py", line 12, in __main__.fibonacci
Failed example:
   fibonacci(20)
Expected:
   6765
Got:
   10946
**********************************************************************
1 items had failures:
   3 of 4 in __main__.fibonacci
***Test Failed*** 3 failures.

我們可以在上面的輸出中看到三個測試失敗了。