unittest框架: import unittest import json # 是python内置的单元测试框架(模块),不仅可以完成单元测试,也适用于自动化测试中。 # unittest提供了丰富的断言方法,判断测试用力是否通过,然后生成测试结果报告 # class Mycase(unittest.TestCase): # def runTest(self): # print('我是一个聪明的人') # def bbb(self): # print('我是一个笨比') # # my_case=Mycase(methodName='bbb') # my_case.run() # setUP和tearDown # setUP每条用例执行之前,一般做初始化的配置 # tearDown每条用例执行之后,一般做收尾工作 # class Mycase(unittest.TestCase): # # def setUp(self) -> None: # print('我需要优先完成什么') # # def runTest(self): # print('我是一个聪明的人') # # def tearDown(self) -> None: # print('gogogo') # # def bbb(self): # print('我是一个笨比') # # def test(self): # print('我是女警察') # # def test1(self): # print('小偷站住别跑') # # if __name__=='__main__': # unittest.main() # class TestAssert(unittest.TestCase): # def setUp(self) -> None: # print('我需要优先完成什么') # # # def tearDown(self) -> None: # print('gogogo') # # def test1(self): # self.assertTrue('1',msg='不为真') # # def test2(self): # self.assertEqual(1,2,msg='1==1') # # def test(self): # a={'code':200,'msg':'登录成功'} # # b='code' # # a=json.dumps(a) # b=200 # # self.assertIn(b,a,msg='断言信息备注') # self.assertIn(b,a.values(),msg='断言信息备注') # # # if __name__ == '__main__': # unittest.main() # self.testMethodName 返回用例(当前方法)的名字 # self.testMethodDoc 返回用例(当前方法)的备注信息 class TestH(unittest.TestCase): def test_z(self): print('小豆丁') print('123',self.testMethodName) print('456', self.testMethodDoc) def test_a(self): print('小黄人') print('666', self.testMethodName) print('777', self.testMethodDoc) def test_A(self): print('test_A') def test_Z(self): print('test_Z') if __name__=='__main__': unittest.main() # 来看看unittest为我们提供了哪些断言方法吧! # # unittet.TestCase提供了一些断言方法用来检查并报告故障。 # # 下表列出了最常用的方法: # # Method Checks that description New in # assertEqual(a, b, msg) a == b 如果a不等于b,断言失败 # assertNotEqual(a, b, msg) a != b 如果a等于b,断言失败 # assertTrue(x, msg) bool(x) is True 如果表达式x不为True,断言失败 # assertFalse(x, msg) bool(x) is False 如果表达式x不为False,断言失败 # assertIs(a, b, msg) a is b 如果a is not 2,断言失败 3.1 # assertIsNot(a, b, msg) a is not b 如果a is b,断言失败 3.1 # assertIsNone(x, msg) x is not None 如果x不是None,断言失败 3.1 # assertIn(a, b, msg) a in b 如果a not in b,断言失败 3.1 # assertNotIn(a, b, msg) a not in b 如果a in b,断言失败 3.1 # assertIsInstance(a, b, msg) isinstance(a, b) 如果a不是b类型,断言失败 3.2 # assertNotIsInstance(a, b, msg) not isinstance(a, b) 如果a是b类型,断言失败 3.2
TestSuite
# TestSuite是一个测试套件,简单理解为承载多个用力的集合,或者把它想象成一个盒子 # 把用例添加到盒子中,然后去找一个执行器,去执行盒子中的测试用例 # 我们需要: # 1.实例化所有的用例 # 2.创建一个容器 # 3.将用例添加到容器中 # 4.收集用例完毕,使用执行器来执行容器中的用例 import unittest class Mycase(unittest.TestCase): def test_upper(self): self.assertTrue('FPP'.isupper()) def test_lower(self): self.assertTrue('fPP'.islower()) #断言失败就会返回值F if __name__=='__main__': #实例化所有的用例 case1=Mycase(methodName='test_upper') case2 =Mycase(methodName='test_lower') #创建一个容器 ha=unittest.TestSuite() #3.将用例添加到容器中 # ha.addTest(case1) # ha.addTest(case2) # ha.addTests([case1,case2]) # ha.addTests((case1, case2)) #4.收集用例完毕,使用执行器来执行容器中的用例 runner=unittest.TextTestRunner() runner.run(ha) #查看盒子中有多少用例 print(12,ha.countTestCases())
TestLoader
# 1.loadTestsFromModule #发现其他目录中的脚本文件 # 1.首先目录bicultural是一个包,带有__init__的文件 # 2.找到执行模板下面unittest.TestCase子类,获取其中test开头的用例 import unittest from log import test_case if __name__=='__main__': suite=unittest.TestLoader().loadTestsFromModule(test_case) unittest.TextTestRunner(verbosity=2).run(suite)
discover
import os from HTMLTestRunner import HTMLTestRunner import unittest # os.path.abspath(__file__) #拿到当前脚本的绝对路径 # # os.path.dirname(os.path.abspath(__file__))#拿到当前脚本文件的绝对路径 # # print(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) TEST_CASE_DIR=os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))),'test_case') # print(TEST_CASE_DIR)#获取包名位置v suite=unittest.TestLoader().discover( start_dir=TEST_CASE_DIR, #起始目录 pattern='tes*.py',#规则 # top_level_dir=TEST_CASE_DIR #顶级目录 ) f=open('../report/Areport.html','wb') HTMLTestRunner( stream=f, title='自动化测试报告', description='测试报告的描述', verbosity=2 ).run(suite) # unittest.TextTestRunner(verbosity=2).run(suite) # verbosity=2 详细模式,会显示来自哪个用例哪个方法 1 默认模式,通过之后显示.,失败之后显示F 0 精简模式,通过之后没提示,不显示.
6.setUpClass和tearDownClass
import unittest class TestAssert(unittest.TestCase): def setUp(self) -> None: print('我需要优先完成什么') def tearDown(self) -> None: print('gogogo') def test1(self): self.assertTrue('1',msg='不为真') def test2(self): self.assertEqual(1,2,msg='1==1') def test(self): a={'code':200,'msg':'登录成功'} # b='code' # a=json.dumps(a) b=200 # self.assertIn(b,a,msg='断言信息备注') self.assertIn(b,a.values(),msg='断言信息备注') @classmethod def setUpClass(cls) -> None: print('所有用例执行之前只执行一次,我就要处理的事情') @classmethod def tearDownClass(cls) -> None: print('所有用例执行后,只执行一次,我需要处理的事情') # if __name__ == '__main__': unittest.main()
7.skip跳过用例
import unittest class TestAssert(unittest.TestCase): @unittest.skip('无条件跳过') def test1(self): self.assertTrue('1',msg='不为真') def test2(self): self.assertEqual(1,1,msg='1==1') @unittest.skipIf(condition=3>2,reason='满足条件跳过') def test(self): a={'code':200,'msg':'登录成功'} # b='code' # a=json.dumps(a) b=200 # self.assertIn(b,a,msg='断言信息备注') self.assertIn(b,a.values(),msg='断言信息备注') # if __name__ == '__main__': unittest.main(verbosity=2)
邮件
import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.header import Header # 第三方 SMTP 服务 mail_host = "smtp.qq.com" # 设置服务器 mail_user = "[email protected]" # 用户名 mail_pass = "bjhjabrxgheqbffb" # 获取授权码 sender = '[email protected]' # 发件人账号 receivers = ['[email protected]'] # 接收邮件(可以多个),可设置为你的QQ邮箱或者其他邮箱 # 创建一个带附件的实例 message = MIMEMultipart() message['From'] = Header("我是发件人", 'utf-8') # 发件人 message['To'] = Header("我是收件人", 'utf-8') # 收件人 subject = 'Python发送带附件的邮件示例' message['Subject'] = Header(subject, 'utf-8') # 邮件正文内容 send_content = 'hi man,你收到附件了吗?' content_obj = MIMEText(send_content, 'plain', 'utf-8') # 第一个参数为邮件内容 message.attach(content_obj) # 构造附件1,发送当前目录下的 t1.txt 文件 att1 = MIMEText(open('7.skip跳过用例.py', 'rb').read(), 'base64', 'utf-8') att1["Content-Type"] = 'application/octet-stream' # 这里的filename可以任意写,写什么名字,邮件附件中显示什么名字 att1["Content-Disposition"] = 'attachment; filename="7.skip跳过用例.py.py"' message.attach(att1) # 构造附件2,发送当前目录下的 t2.py 文件 att2 = MIMEText(open('1.unittest框架.py', 'rb').read(), 'base64', 'utf-8') att2["Content-Type"] = 'application/octet-stream' att2["Content-Disposition"] = 'attachment; filename="6.setUpClass和tearDownClass.py"' message.attach(att2) try: smtpObj = smtplib.SMTP() smtpObj.connect(mail_host, 25) # 25 为 SMTP 端口号 smtpObj.login(mail_user, mail_pass) smtpObj.sendmail(sender, receivers, message.as_string()) print("邮件发送成功") except smtplib.SMTPException: print("Error: 无法发送邮件")
生成测试报告
from HTMLTestRunner import HTMLTestRunner import unittest class TestAssert(unittest.TestCase): def test1(self): self.assertTrue('1',msg='不为真') def test2(self): self.assertEqual(1,1,msg='1==1') def test(self): a={'code':200,'msg':'登录成功'} # b='code' # a=json.dumps(a) b=200 # self.assertIn(b,a,msg='断言信息备注') self.assertIn(b,a.values(),msg='断言信息备注') if __name__ == '__main__': case1=TestAssert(methodName='test1') case2 = TestAssert(methodName='test2') case3 = TestAssert(methodName='test') suite=unittest.TestSuite() suite.addTests([case1,case2,case3]) f=open('../report/report.html','wb') HTMLTestRunner( stream=f, title='自动化测试报告', description='测试报告的描述', verbosity=2 ).run(suite)