unittest
初识
import unittest class MyCase(unittest.TestCase): def runTest(self): print('我是runtest') def www(self): print('我是www') if __name__ == '__main__': # mycase=MyCase() # mycase.run() # 可以直接调用runtest()方法,因为在TestCase中默认反射了runtest到run中 mycase=MyCase(methodName='www') # 将www方法反射到TestCase中,调用run,实际调用的是www方法 mycase.run()
setup 和 teardown
class MyCase(unittest.TestCase): def tearDown(self) -> None: # 自动联想,有无None都可以 print('每条用例执行后要做的事情') # 不分位置 def setUp(self) -> None: print('每条用例执行前要做的事情') def runTest(self): print('我是runtest') def www(self): print('我是www') if __name__ == '__main__': mycase=MyCase() mycase.run()
setupclass 和 teardownclass
import unittest class MyUnitTest(unittest.TestCase): def test_add(self): print('test_add') def test_sub(self): print('test_sub') def setUp(self) -> None: '''每条用例执行前执行我''' print('敌军还有三十秒到达战场') def tearDown(self) -> None: '''每条用例执行后执行我''' print('act....') @classmethod def setUpClass(cls) -> None: print('所有用例执行前,我先执行一次') @classmethod def tearDownClass(cls) -> None: print('所有用例执行完后,我执行一次') if __name__ == '__main__': unittest.main()
断言 main()方法
# python 自带断言 # assert 0 import unittest unittest提供的断言方法 unittest 执行用例,是按照ascci码的顺序 class AssertMsg(unittest.TestCase): def tearDown(self) -> None: print('每条用例执行后要做的事情') # 不分位置 def setUp(self) -> None: print('每条用例执行前要做的事情') def test_assertEqual(self): self.assertEqual(1,2,msg='备注信息,方便查找,msg可以不写') def test_assertTrue(self): self.assertTrue(1) def test_assertIn(self): data={'code':200,'msg':'登录成功'} data=str(data) self.assertIn('登录成功',data,msg='备注信息') def test_assertIsInstance(self): a=[] self.assertIsInstance(a,list) def aaa(self): # 不是test的方法,无法执行 unittest框架,只能识别test_开头的方法 print('我是aaa') if __name__ == '__main__': #__main__当前文件 unittest.main() # 执行当前文件下,所有test开头的方法 class AssertMsg(unittest.TestCase): def test_a(self): ''' 我是注释 :return: ''' print('test_a!!!!!!!!!',self._testMethodName) # 返回用例名字 print('test_a!!!!!!!!',self._testMethodDoc)# 返回用例的注释信息 if __name__ == '__main__': unittest.main()
TestSuit
# TestSuite是测试套件,是一个承载多个用例的集合,或者想象成一个盒子 # 步骤: # 1.实例化所有用例 # 2.创建一个盒子(容器) # 3.将用例添加到盒子中 # 4.收集用例完成后,使用执行器去执行盒子中的用例 import unittest class MyCase(unittest.TestCase): def test_is_upper(self): self.assertTrue('Wsd'.isupper()) def test_is_lower(self): self.assertTrue('sdfsd'.islower()) print('1111111111111') if __name__ == '__main__': #实例化用例 case1=MyCase(methodName='test_is_upper') case2=MyCase(methodName='test_is_lower') #创建盒子 suite=unittest.TestSuite() #用例添加到盒子里 # suite.addTest(case1) # suite.addTest(case2) suite.addTests([case1,case2]) #收集完毕后,用执行器执行 runner=unittest.TextTestRunner() runner.run(suite)
TestLoader
import unittest # unittest.TestLoader().loadTestsFromModule() # 发现其他目录中的脚本用例 # 1.目录必须是一个包 # 2.找到指定模块下面unittest.TestCase子类,获取其中以test开头的用例 from bao_day9 import test1 if __name__ == '__main__': # 只能点击三角绿色的运行 suite=unittest.TestLoader().loadTestsFromModule(test1) unittest.TextTestRunner(verbosity=2).run(suite)
discover
import unittest import os #discover方法要求必须是包才能执行 # discover批量执行用例 if __name__ == '__main__': ret=os.path.dirname(os.path.abspath(__file__)) # 只到目录的绝对路径 print(ret) test_path=os.path.join(ret,'testcase') print(test_path) suite=unittest.TestLoader().discover(start_dir=test_path,pattern='test*.py') unittest.TextTestRunner(verbosity=2).run(suite) #verbosity 三种模式 # 0 精简模式,通过后没提示 # 1 默认模式,通过.,失败F # 2 详细模式,可以看到来自哪个用例,成功或失败
skip跳过
import unittest # unittest.skip(reason) # reason 跳过用例的原因描述,无条件跳过 # unittest.skipIf(condition,reason) # 有条件跳过, 为真,跳过 class MyCase(unittest.TestCase): @unittest.skip('无条件跳过') def test_01(self): print('11111111111') def test_is_upper(self): self.assertTrue('Wsd'.isupper()) def test_is_lower(self): self.assertTrue('sdfsd'.islower()) @unittest.skipIf(condition=1<2,reason='有条件跳过') def test_02(self): print('22222222222') if __name__ == '__main__': unittest.main(verbosity=2)
生成测试报告
import unittest from HTMLTestRunner import HTMLTestRunner class MyCase(unittest.TestCase): def test_is_upper(self): self.assertTrue('Wsd'.isupper()) def test_is_lower(self): self.assertTrue('sdfsd'.islower()) @unittest.skipIf(condition=1<2,reason='有条件跳过') def test_02(self): print('22222222222') if __name__ == '__main__': case1=MyCase(methodName='test_is_upper') case2 = MyCase(methodName='test_is_lower') case3 = MyCase(methodName='test_02') suite=unittest.TestSuite() suite.addTests([case1,case2,case3]) f=open('../report/report_day14.html','wb') HTMLTestRunner(stream=f,verbosity=2).run(suite)
discover方法生成测试报告
import unittest import os from HTMLTestRunner import HTMLTestRunner class MyCase(unittest.TestCase): def test_is_upper(self): self.assertTrue('Wsd'.isupper()) def test_is_lower(self): self.assertTrue('sdfsd'.islower()) @unittest.skipIf(condition=1<2,reason='有条件跳过') def test_02(self): print('22222222222') if __name__ == '__main__': ret = os.path.dirname(os.path.abspath(__file__)) # 只到目录的绝对路径 test_path = os.path.join(ret, 'testcase') suite = unittest.TestLoader().discover(start_dir=test_path, pattern='test*.py') f=open('../report/report_day14.html','wb') HTMLTestRunner( stream=f, title='WMS仓储项目测试报告', # 标题 verbosity=2, description='通过率不错' # 描述 ).run(suite)