Py学习  »  Python

有没有更有效/更好的方法用python编写测试用例?

Aria West • 3 年前 • 1482 次点击  

有没有更有效的方法用python编写测试用例?每当代码重复时,我的测试用例都会重复——有更好的方法来编写它,但有什么更好的方法呢? 这是我的代码:

def are_anagrams(s1, s2):
    if len(s1) != len(s2):
        return False
    elif sorted(s1) == sorted(s2):
        return True
    else:
        return False

    #all below I want to write in a better way
#Test cases
        s1 = "danger"
        s2 = "garden"
        print(are_anagrams(s1,s2))
        t1 = "nameless"
        t2 = "salesmen"
        print(are_anagrams(t1,t2))
        a1 = "name"
        a2 = "sale"
        print(are_anagrams(a1,a2))
        b1 = "n"
        b2 = "sa"
        print(are_anagrams(b1,b2))
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/131988
 
1482 次点击  
文章 [ 2 ]  |  最新文章 3 年前
Cory Kramer
Reply   •   1 楼
Cory Kramer    3 年前

您应该使用一个实际的单元测试库,比如内置的 unittest 单元

import unittest

def are_anagrams(s1, s2):
    if len(s1) != len(s2):
        return False
    elif sorted(s1) == sorted(s2):
        return True
    else:
        return False
        
class TestAnagrams(unittest.TestCase):
    def test_anagrams(self):
        self.assertTrue(are_anagrams('danger', 'garden'))
        self.assertTrue(are_anagrams('nameless', 'salesmen'))
    def test_not_anagrams(self):
        self.assertFalse(are_anagrams('name', 'sale'))
        self.assertFalse(are_anagrams('n', 'sa'))
        
if __name__ == '__main__':
    unittest.main()
Samwise
Reply   •   2 楼
Samwise    3 年前

不要为只会使用一次的值创建命名变量,尤其是在名称没有添加任何有用信息的情况下(这适用于一般代码,而不仅仅是测试):

print(are_anagrams("danger", "garden"))
print(are_anagrams("nameless", "salesmen"))
print(are_anagrams("name", "sale"))
print(are_anagrams("n", "sa"))

如果你 assert 而不是仅仅打印期望值;这样,您就不需要查看输出并将其与您期望的结果进行比较,您只需运行测试,如果它没有引发 AssertionError 你知道代码的工作方式与你期望的一样:

assert are_anagrams("danger", "garden")
assert are_anagrams("nameless", "salesmen")
assert not are_anagrams("name", "sale")
assert not are_anagrams("n", "sa")

编写这样的测试序列的另一种方法是创建一个表,然后遍历它,例如:

test_cases = [
    ("danger", "garden", True),
    ("nameless", "salesmen", True),
    ("name", "sale", False),
    ("n", "sa", False),
]

for s1, s2, result in test_cases:
    assert are_anagrams(s1, s2) == result

当测试用例更复杂时,表格技术更有用,因为它可以更容易地直观地组织测试数据,以验证您是否覆盖了所有可能的输入组合;它还提供了动态生成表的可能性。