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 = "1057324156@qq.com" # 用户名
mail_pass = "bjhjabrxgheqbffb" # 获取授权码
sender = '1057324156@qq.com' # 发件人账号
receivers = ['2621623235@qq.com'] # 接收邮件(可以多个),可设置为你的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)



