# 1.首先认识一下assert断言 ''' 断言:就是断定一个条件是成立的,然后才能继续往下走,否则报错 ''' def foo(): return "古明地觉" # 这里我们断言foo返回值是str类型,如果不是的话,就会报错,那么程序是不会往下走的 assert isinstance(foo(), str) print(123) # 123 # 这里显然会报错 assert 1 == 2
# 但是这样的报错不明显,我们可以在后面加上提示 assert 1 + 1 == 9, "1加1怎么会等于9呢?你个baka⑨"
错误、异常、断言的区别
错误:一种是语法错误,就是那种非常低级的错误,连编译都通不过。还有一种是逻辑错误,这种错误只有在解释执行的时候才能发现
异常:
异常产生:解释器检测到异常并抛出
异常处理:截获异常,忽略或终止处理异常
断言:拿实际的结果和预期的结果进行比较,说白了就是比的过程
单元测试也是类似,就是比的过程,看看一不一样
''' 测试用例:是为某个特殊目标而编制的一组测试输入,执行条件以及预测结果, 以便测试某个程序是否满足需求 unittest中的几个重要的概念 1. Test Fixture:就是Setup()和Teardown()对一个测试用例环境的搭建和销毁,是一个fixture Setup类似于打仗,创建战场,Teardown()就是仗打完了清理战场 2. Test case:一个Test case就是一个测试用例 3. Test suite:测试用例集合,里面包含了一系列的测试用例 把每一个测试用例想象成一根筷子,那么测试用例集合相当于一个圆筒 ''' import unittest # 导入unittest class Mytest(unittest.TestCase): ''' 定义一个类,这个类必须继承自unittest下的TestCase类 ''' # 父类里面写好的方法 def setUp(self): print("环境预测") # 自己定义的方法 def test_something(self): print("测试用例") # 传入三个参数,前两个是用来比较是否相等的。 # 第三个是错误信息 # 几种常用的断言 ''' assertEqual(a, b) a == b assertNotEqual(a, b) a != b assertTrue(x) bool(x) is True assertFalse(x) bool(x) is False assertIsNone(x) x is None assertIsNotNone(x) x is not None assertIn(a, b) a in b assertNotIn(a, b) a not in b ''' self.assertEqual(True, True) # 父类里面写好的方法 def tearDown(self): print("环境销毁") # 调用unittest下的main方法,自动执行 if __name__ == '__main__': unittest.main() ''' 环境预测 测试用例 环境销毁 Ran 1 test in 0.001s OK ''' # 不管什么时候,setUp和tearDown一定是会执行的,setUp最先执行,tearDown最后执行
import unittest class Mytest(unittest.TestCase): def setUp(self): print("环境预测") def test_something(self): print("测试用例") # 我们将原来的True改成False self.assertEqual(True, False, "true和false不一样") def tearDown(self): print("环境销毁") if __name__ == '__main__': unittest.main() r''' 环境预测 测试用例 环境销毁 true和false不一样 False != True Expected :True Actual :False <Click to see difference> Traceback (most recent call last): File "E:\PyCharm\helpers\pycharm\teamcity\diff_tools.py", line 32, in _patched_equals old(self, first, second, msg) File "C:\python37\lib\unittest\case.py", line 839, in assertEqual assertion_func(first, second, msg=msg) File "C:\python37\lib\unittest\case.py", line 832, in _baseAssertEqual raise self.failureException(msg) AssertionError: True != False : true和false不一样 During handling of the above exception, another exception occurred: Traceback (most recent call last): File "C:\python37\lib\unittest\case.py", line 59, in testPartExecutor yield File "C:\python37\lib\unittest\case.py", line 615, in run testMethod() File "D:\~python~\单元测试\3.py", line 10, in test_something self.assertEqual(True, False, "true和false不一样") Ran 1 test in 0.003s FAILED (failures=1) '''
import unittest class Mytest(unittest.TestCase): def setUp(self): print("环境预测") def test_something(self): print("测试用例") # 我们将原来的True改成False self.assertEqual(True, True, "true和false不一样") def tearDown(self): print("环境销毁") @classmethod def setUpClass(cls): # 要使用类装饰器,所有test运行之前执行 print("我最先执行") @classmethod def tearDownClass(cls): # 要使用类装饰器,所有test运行之后执行 print("我最后执行") if __name__ == '__main__': unittest.main() ''' 我最先执行环境预测 测试用例 环境销毁 我最后执行 Ran 1 test in 0.000s OK '''
import unittest # 也可以一次性验证多个testcase class Mytest1(unittest.TestCase): def test1(self): print("this is test1") def test2(self): print("this is test2") class Mytest2(unittest.TestCase): def test3(self): print("this is test3") def test4(self): print("this is test4") if __name__ == '__main__': suite1 = unittest.TestLoader().loadTestsFromTestCase(Mytest1) suite2 = unittest.TestLoader().loadTestsFromTestCase(Mytest2) suite = unittest.TestSuite([suite1, suite2]) # TextTestRunner还有一个stream参数,可以传入一个文件句柄,输出到文件里 unittest.TextTestRunner(verbosity=2).run(suite) ''' this is test1 this is test2 this is test3 this is test4 Ran 4 tests in 0.001s OK '''
我们可以用来干一些其他的事情
satori.py
def satori(arr): return sum(arr)
import unittest import satori class Test(unittest.TestCase): def test(self): self.assertEqual(satori.satori([1, 2, 3]), 7) if __name__ == '__main__': unittest.main() r''' Ran 1 test in 0.002s FAILED (failures=1) 7 != 6 Expected :6 Actual :7 <Click to see difference> Traceback (most recent call last): File "E:\PyCharm\helpers\pycharm\teamcity\diff_tools.py", line 32, in _patched_equals old(self, first, second, msg) File "C:\python37\lib\unittest\case.py", line 839, in assertEqual assertion_func(first, second, msg=msg) File "C:\python37\lib\unittest\case.py", line 832, in _baseAssertEqual raise self.failureException(msg) AssertionError: 6 != 7 '''