在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Python/ 測試線程應(yīng)用程序
事件驅(qū)動程序
反應(yīng)式編程
進(jìn)程池
線程
線程池
Python并發(fā)簡介
并發(fā)vs并行
同步線程
調(diào)試線程應(yīng)用程序
進(jìn)程間通信
線程通信
Python并發(fā)編程教程
測試線程應(yīng)用程序
基準(zhǔn)和性能分析
系統(tǒng)和內(nèi)存架構(gòu)
線程的實(shí)現(xiàn)
多進(jìn)程

測試線程應(yīng)用程序

在本章中,我們將學(xué)習(xí)線程應(yīng)用程序的測試。也將學(xué)習(xí)測試的重要性。

為什么要測試?

在我們深入討論測試的重要性之前,需要知道什么是測試。 一般來說,測試是一種發(fā)現(xiàn)某件事情如何發(fā)揮作用的技術(shù)。 另一方面,特別是如果談?wù)撚?jì)算機(jī)程序或軟件,那么測試就是訪問軟件程序功能的技術(shù)。

在本節(jié)中,我們將討論軟件測試的重要性。 在軟件開發(fā)中,在向客戶端發(fā)布軟件之前必須進(jìn)行雙重檢查。 這就是為什么經(jīng)驗(yàn)豐富的測試團(tuán)隊(duì)測試軟件非常重要。 從以下幾點(diǎn)來理解軟件測試的重要性 -

1. 提高軟件質(zhì)量
當(dāng)然,沒有公司想要提供低質(zhì)量的軟件,也沒有客戶想要購買低質(zhì)量的軟件。 測試通過查找并修復(fù)其中的錯誤來提高軟件的質(zhì)量。

2. 客戶滿意度
任何企業(yè)最重要的部分是客戶的滿意度。 通過提供無錯誤和高質(zhì)量的軟件,公司可以實(shí)現(xiàn)客戶滿意度。

3. 減少新功能的影響
假設(shè)我們已經(jīng)制作了10000行的軟件系統(tǒng),并且我們需要添加一個新功能,那么開發(fā)團(tuán)隊(duì)就會擔(dān)心這個新功能對整個軟件的影響。 在這里,測試也起著至關(guān)重要的作用,因?yàn)槿绻麥y試團(tuán)隊(duì)已經(jīng)完成了一套很好的測試,那么它可以幫助我們避免任何潛在的災(zāi)難性休息。

4. 用戶體驗(yàn)
任何業(yè)務(wù)中另一個最重要的部分是該產(chǎn)品用戶的體驗(yàn)。 只有測試才能確保最終用戶發(fā)現(xiàn)使用該產(chǎn)品簡單易用。

5. 削減開支
測試可以通過在測試開發(fā)的測試階段找到并修復(fù)錯誤而不是在交付后修復(fù)軟件來降低軟件的總成本。 如果在交付軟件后出現(xiàn)重大缺陷,那么就費(fèi)用和無形成本而言,例如客戶不滿意度,公司負(fù)面聲譽(yù)等方面,它會增加其有形成本。

要測試什么?

總是建議對要測試的內(nèi)容有適當(dāng)?shù)闹R。 在本節(jié)中,我們將首先了解測試任何軟件時測試人員的主要動機(jī)。 應(yīng)該避免使用代碼覆蓋率,即測試套件在測試時碰到多少行代碼。 這是因?yàn)?,在測試時,只關(guān)注代碼行數(shù)量并不會增加系統(tǒng)的實(shí)際價值。 可能存在一些錯誤,即使在部署之后,稍后也會反映出來。

考慮以下與測試內(nèi)容相關(guān)的重要問題 -

  • 需要關(guān)注測試代碼的功能而不是代碼覆蓋。
  • 需要首先測試代碼中最重要的部分,然后轉(zhuǎn)向代碼中不太重要的部分。這肯定會節(jié)省時間。
  • 測試儀必須有多種不同的測試,可以將軟件推到極限。

測試并行軟件程序的方法

由于利用多核架構(gòu)的真實(shí)能力,并行軟件系統(tǒng)正在取代順序系統(tǒng)。 最近,從手機(jī)到洗衣機(jī),從汽車到飛機(jī)等,所有的并發(fā)系統(tǒng)程序都在使用。需要更加小心地測試并發(fā)軟件程序,因?yàn)槿绻麨閱尉€程應(yīng)用程序添加了多個線程, 已經(jīng)是一個錯誤,那么最終會遇到多個錯誤。

并發(fā)軟件程序的測試技術(shù)主要集中在選擇交錯方面,這些交錯方式暴露了潛在的有害模式,如競態(tài)條件,死鎖和原子性違規(guī)。 以下是測試并發(fā)軟件程序的兩種方法 -

系統(tǒng)的探索
這種方法旨在盡可能廣泛地探索交織的空間。 這些方法可以采用強(qiáng)力技術(shù),而其他方法則采用部分降階技術(shù)或啟發(fā)式技術(shù)來探索交織的空間。

屬性驅(qū)動

屬性驅(qū)動方法依賴于觀察到并發(fā)錯誤更有可能發(fā)生在交錯之下,這些交錯揭示了諸如可疑內(nèi)存訪問模式之類的特定屬性。 不同的財(cái)產(chǎn)驅(qū)動方法針對不同的故障,如競態(tài)條件,死鎖和違反原子性,這進(jìn)一步取決于一個或其他特定屬性。

測試策略

測試策略也被稱為測試方法。 該策略定義了如何進(jìn)行測試。 測試方法有兩種技術(shù) -

主動
盡早開始測試設(shè)計(jì)過程以便在創(chuàng)建構(gòu)建之前查找并修復(fù)缺陷的方法。

反應(yīng)
直到完成開發(fā)過程才開始測試的方法。

在對python程序應(yīng)用任何測試策略或方法之前,我們必須對軟件程序可能存在的錯誤類型有一個基本的想法。 錯誤如下 -

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

語義錯誤
語義錯誤也被稱為邏輯錯誤。 如果軟件程序中存在邏輯或語義錯誤,則該語句將編譯并正確運(yùn)行,但由于邏輯不正確,它不會給出所需的輸出。

單元測試

這是測試python程序最常用的測試策略之一。 該策略用于測試代碼的單元或組件。 我們指單位或組件代表代碼的類別或功能。 單元測試通過測試“小”單元來簡化大型編程系統(tǒng)的測試。 在上述概念的幫助下,單元測試可以被定義為一種方法,其中對源代碼的各個單元進(jìn)行測試以確定它們是否返回期望的輸出。

在接下來的章節(jié)中,我們將學(xué)習(xí)單元測試的不同Python模塊。

unittest模塊

單元測試的第一個模塊是unittest模塊。 它受JUnit的啟發(fā),默認(rèn)包含在Python3.6中。 它支持測試自動化,共享測試的設(shè)置和關(guān)閉代碼,將測試集合到集合中,以及測試獨(dú)立于報(bào)告框架。

以下是unittest模塊支持的一些重要概念

文本夾具
它用于設(shè)置測試,以便在測試結(jié)束后可以在開始測試和拆卸之前運(yùn)行測試。 它可能涉及在開始測試之前創(chuàng)建臨時數(shù)據(jù)庫,目錄等。

測試用例
測試用例檢查所需的響應(yīng)是否來自特定的一組輸入。 unittest模塊包含一個名為TestCase的基類,可用于創(chuàng)建新的測試用例。 它包括兩個默認(rèn)方法 -

  • setUp() - 在鍛煉之前設(shè)置測試夾具的鉤子方法。 這在調(diào)用實(shí)現(xiàn)的測試方法之前調(diào)用。
  • tearDown() - 在類中運(yùn)行所有測試之后解構(gòu)類裝置的鉤子方法。

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

測試運(yùn)行
它控制測試用例或套裝的運(yùn)行并向用戶提供結(jié)果。 它可以使用GUI或簡單的文本界面來提供結(jié)果。

以下Python程序使用unittest模塊來測試名為Fibonacci的模塊。 該計(jì)劃有助于計(jì)算一個數(shù)字的斐波那契數(shù)列。 在這個例子中,我們創(chuàng)建了一個名為Fibo_test類,通過使用不同的方法來定義測試用例。 這些方法從unittest.TestCase繼承。 我們使用兩個默認(rèn)方法 - 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()

當(dāng)從命令行運(yùn)行時,上面的腳本產(chǎn)生一個看起來像這樣的輸出 -

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

現(xiàn)在,為了更清楚一點(diǎn),修改上面的代碼,這有助于定義斐波那契模塊。

以下面的代碼塊為例 -

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

現(xiàn)在,使用更改后的代碼運(yùn)行腳本后,將得到以下輸出 -

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模塊也有助于單元測試。 它也預(yù)裝python。 它比單元測試模塊更容易使用。 unittest模塊更適合于復(fù)雜的測試。要使用doctest模塊,可以直接導(dǎo)入它。 相應(yīng)函數(shù)的文檔字符串必須具有交互式python會話及其輸出。

如果代碼中一切正常,那么docktest模塊將不會有輸出; 否則,它會提供輸出。

示例

以下Python示例使用docktest模塊來測試名為Fibonacci的模塊,該模塊有助于計(jì)算數(shù)字的斐波那契數(shù)列。

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的相應(yīng)函數(shù)的文檔字符串具有交互式python會話和輸出。 如果代碼沒有問題,那么doctest模塊將不會有輸出。 但要了解它的工作原理,我們可以使用-v選項(xiàng)運(yùn)行它。

(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.

現(xiàn)在,我們將更改幫助定義斐波那契模塊的代碼,以下面的代碼塊為例 -

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

在運(yùn)行腳本后,即使沒有-v選項(xiàng),使用更改后的代碼,我們將得到如下所示的輸出。

(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.

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