断言(assert),表示为一些布尔表达式编写代码时,开发人员总是会在某些特定点做出一些假设,来判断程序是否达到预期。
def score_grade(score): if not isinstance(score,int): raise TypeError("你应该输入一个整数类型") if not (0<=score<=100): raise Exception("你输入的整数范围应该在0-100之间") if 0<=score<60: return "D" elif 60<=score<=75: return 'C' elif 75<score<=85: return 'B' else: return 'A'上面的代码就不做解释了,非常简单易懂。编写单元测试,需要从 unittest.TestCase 继承。使用 unittest 单元测试框架的时候,需要注意 unittest 规定只有以 test 开头的方法才是测试方法,所以我们使用的时候要注意命名规则,编写下面代码:
import unittest class TestScore(unittest.TestCase): def test_exception(self): with self.assertRaises(TypeError): score_grade('x') def test_score(self): self.assertEqual(score_grade(86),'A') self.assertNotEqual(score_grade(86),'B') self.assertTrue(score_grade(86) is 'A')我们对上述代码做一下解析:我们定义了一个测试类 TestScore,它继承自 unittest.TestCase 即测试用例类。可以这样理解,每一个继承 TestCase 类的子类里面实现的具体的方法(也就是以 test 开头的方法)都是一条测试用例。
断言方法 | 含义 |
---|---|
assertEqual(first,second,msg=None) | 测试first == second,否则抛出断言异常信息msg; |
assertNotEqual(first,second,msg = None) | 测试first!=second,否则抛异常信息msg; |
assertTrue(expr,msg=None) | 测试表达式expr为True,否则抛出断言异常信息msg; |
assertFalse(expr,msg=None) | 测试表达式expr为False,否则抛出断言异常信息msg; |
assertIs(a,b,msg=None) | 测试a和b是同一对象,否则抛出断言异常信息msg; |
assertIsNot(a,b,msg=None) | 测试a和b不是同一对象,否则抛出断言异常信息msg; |
assertIsNone(expr,msg=None) | 测试表达式expr结果为None,否则抛出断言异常信息msg; |
assertIsNotNone(expr,msg=None) | 测试表达式expr结果不为None,否则抛出断言信息异常; |
assertIn(a,b,msg=None) | 测试a包含在b中,否则抛出断言异常信息msg; |
assertIsInstance(obj,cls,msg=None) | 断言obj为cls类型,否则抛出断言异常信息msg; |
assertRaisesRegexp(exc,r[,fun,*args,**kwds]) | 测试函数fun(*args,**kwds)抛出exc异常,同时可以用正则r去匹配异常信息exc,否则抛出断言异常; |
assertRaises(exc[,fun,*args,**kwds]) | 测试函数fun(*args,**kwds)抛出exc异常,否则抛出断言异常; |
python -m unittest test如果只想执行 TestScore 类中定义的测试用例,可以使用如下方式:
python -m unittest test.TestScore最终的执行结果如下所示:
C:\Users\Administrator\Book\BookStore>python -m unittest .. ---------------------------------------------------------------------- Ran 2 tests in 0.001s OK若最终显示结果为 OK 表示测试成功,并且上面信号还包含了执行测试方法的个数和执行所需的时间,如果测试不通过呢?我们可以进行以下稍微的改动,将 test_score中的第一个断言更改为,如下所示:
self.assertEqual(score_grade(86),'B')当我们再去执行测试的时候,就会得到如下结果:
C:\Users\Administrator\Book\BookStore>python -m unittest .F ====================================================================== FAIL: test_score (index.test.TestScoreGrade) ---------------------------------------------------------------------- Traceback (most recent call last): File "C:\Users\Administrator\Book\BookStore\index\test.py", line 24, in test_score self.assertEqual(score_grade(86),'B') AssertionError: 'A' != 'B' - A + B ---------------------------------------------------------------------- Ran 2 tests in 0.001s FAILED (failures=1)从返回结果可以得知其中有一个测试用例失败了,用例名称是 test_score,并且给出了失败的原因 AssertionError: 'A' != 'B'。
Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有