一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Python突變測試介紹

Python突變測試介紹

2020-11-30 22:53Linux中國Moshe Zadka Python

你一定對所有內容都進行了測試,也許你甚至在項目倉庫中有一個徽章,標明有 100% 的測試覆蓋率,但是這些測試真的幫到你了嗎?你怎么知道的?

Python突變測試介紹

通過突變測試來修復未知的 bug。

你一定對所有內容都進行了測試,也許你甚至在項目倉庫中有一個徽章,標明有 100% 的測試覆蓋率,但是這些測試真的幫到你了嗎?你怎么知道的?

開發人員很清楚單元測試的成本。測試必須要編寫。有時它們無法按照預期工作:存在假告警或者抖動測試。在不更改任何代碼的情況下有時成功,有時失敗。通過單元測試發現的小問題很有價值,但是通常它們悄無聲息的出現在開發人員的機器上,并且在提交到版本控制之前就已得到修復。但真正令人擔憂的問題大多是看不見的。最糟糕的是,丟失的告警是完全不可見的:你看不到沒能捕獲的錯誤,直到出現在用戶手上 —— 有時甚至連用戶都看不到。

有一種測試可以使不可見的錯誤變為可見:突變測試mutation testing

變異測試通過算法修改源代碼,并檢查每次測試是否都有“變異體”存活。任何在單元測試中幸存下來的變異體都是問題:這意味著對代碼的修改(可能會引入錯誤)沒有被標準測試套件捕獲。

Python 中用于突變測試的一個框架是 mutmut

假設你需要編寫代碼來計算鐘表中時針和分針之間的角度,直到最接近的度數,代碼可能會這樣寫:

def hours_hand(hour, minutes):

    base = (hour % 12 ) * (360 // 12)

    correction = int((minutes / 60) * (360 // 12))

    return base + correction

 

def minutes_hand(hour, minutes):

    return minutes * (360 // 60)

 

def between(hour, minutes):

    return abs(hours_hand(hour, minutes) - minutes_hand(hour, minutes))

首先,寫一個簡單的單元測試:

import angle

 

def test_twelve():

    assert angle.between(12, 00) == 0

足夠了嗎?代碼沒有 if 語句,所以如果你查看覆蓋率:

$ coverage run `which pytest`

============================= test session starts ==============================

platform linux -- Python 3.8.3, pytest-5.4.3, py-1.8.2, pluggy-0.13.1

rootdir: /home/moshez/src/mut-mut-test

collected 1 item                                                              

 

tests/test_angle.py .                                                    [100%]

 

============================== 1 passed in 0.01s ===============================

完美!測試通過,覆蓋率為 100%,你真的是一個測試專家。但是,當你使用突變測試時,覆蓋率會變成多少?

$ mutmut run --paths-to-mutate angle.py

<snip>

Legend for output:

Killed mutants. The goal is for everything to end up in this bucket.

Timeout. Test suite took 10 times as long as the baseline so were killed.

Suspicious. Tests took a long time, but not long enough to be fatal.

Survived. This means your tests needs to be expanded.

Skipped. Skipped.

<snip>

21/21 5 0 0 16 0

天啊,在 21 個突變體中,有 16 個存活。只有 5 個通過了突變測試,但是,這意味著什么呢?

對于每個突變測試,mutmut 會修改部分源代碼,以模擬潛在的錯誤,修改的一個例子是將 > 比較更改為 >=,查看會發生什么。如果沒有針對這個邊界條件的單元測試,那么這個突變將會“存活”:這是一個沒有任何測試用例能夠檢測到的潛在錯誤。

是時候編寫更好的單元測試了。很容易檢查使用 results 所做的更改:

$ mutmut results

<snip>

Survived (16)

 

---- angle.py (16) ----

 

4-7, 9-14, 16-21

$ mutmut apply 4

$ git diff

diff --git a/angle.py b/angle.py

index b5dca41..3939353 100644

--- a/angle.py

+++ b/angle.py

@@ -1,6 +1,6 @@

def hours_hand(hour, minutes):

hour = hour % 12

- base = hour * (360 // 12)

+ base = hour / (360 // 12)

correction = int((minutes / 60) * (360 // 12))

return base + correction

這是 mutmut 執行突變的一個典型例子,它會分析源代碼并將運算符更改為不同的運算符:減法變加法。在本例中由乘法變為除法。一般來說,單元測試應該在操作符更換時捕獲錯誤。否則,它們將無法有效地測試行為。按照這種邏輯,mutmut 會遍歷源代碼仔細檢查你的測試。

你可以使用 mutmut apply 來應用失敗的突變體。事實證明你幾乎沒有檢查過 hour 參數是否被正確使用。修復它:

$ git diff

diff --git a/tests/test_angle.py b/tests/test_angle.py

index f51d43a..1a2e4df 100644

--- a/tests/test_angle.py

+++ b/tests/test_angle.py

@@ -2,3 +2,6 @@ import angle

 

def test_twelve():

assert angle.between(12, 00) == 0

+

+def test_three():

+ assert angle.between(3, 00) == 90

以前,你只測試了 12 點鐘,現在增加一個 3 點鐘的測試就足夠了嗎?

$ mutmut run --paths-to-mutate angle.py

<snip>

21/21 7 0 0 14 0

這項新測試成功殺死了兩個突變體,比以前更好,當然還有很長的路要走。我不會一一解決剩下的 14 個測試用例,因為我認為模式已經很明確了。(你能將它們降低到零嗎?)

變異測試和覆蓋率一樣,是一種工具,它允許你查看測試套件的全面程度。使用它使得測試用例需要改進:那些幸存的突變體中的任何一個都是人類在篡改代碼時可能犯的錯誤,以及潛伏在程序中的隱藏錯誤。繼續測試,愉快地搜尋 bug 吧。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲 欧美 国产 视频二区 | 奇米影视欧美 | 欧美日韩人成在线观看 | 亚洲第成色999久久网站 | 国产成人精品男人的天堂538 | 美女狂揉尿口揉到失禁 | 五月色婷婷网在线观看 | 国产精品一久久香蕉产线看 | 爱草影院| 女人把扒开给男人爽 | 日本一区二区精品88 | 无人区在线观看免费完整版免费 | 性柔术xxxhd| 草莓香蕉榴莲丝瓜秋葵绿巨人在线看 | 精品国产免费久久久久久 | 国产亚洲自愉自愉 | 波多野结衣快播 | 色橹橹 | 91麻豆国产精品91久久久 | 青草草在线 | 久久综合网久久综合 | 久久成人精品免费播放 | 九九九九九热 | 日本高清在线看免费观看 | 桃色视频软件 | 国产福利视频一区二区微拍 | 80日本xxxxxxxxx96| 四虎库 | 日韩欧美推理片免费在线播放 | zoo性欧美 | a级影视 | 男人的天堂欧美 | 为什么丈夫插我我却喜欢被打着插 | ass亚洲熟妇毛茸茸pics | 欧美精品日韩一区二区三区 | 91大神大战高跟丝袜美女 | 欧美日本道免费一区二区三区 | 国产日产欧产精品精品软件 | 日本天堂视频在线观看 | 亚洲 欧美 国产 综合首页 | 黑人巨大videosjapan高清 黑人好大 |