Python中怎么实现突变测试,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
首先,写一个简单的单元测试:
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.1rootdir: /home/moshez/src/mut-mut-testcollected 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 diffdiff --git a/angle.py b/angle.pyindex 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 diffdiff --git a/tests/test_angle.py b/tests/test_angle.pyindex 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
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。