-
重要概念
-
TestCase
- 一个TestCase就是一个测试用例,一个完整的测试流程,包括环境准备(setUp),实现过程(run),环境恢复(tearDown)
- 一个TestCase就是一个测试用例,一个完整的测试流程,包括环境准备(setUp),实现过程(run),环境恢复(tearDown)
-
TestSuite
- TestSuite用来组装单个测试用例,可以通过addTest加载TestCase到TestSuite中,从而返回一个TestSuite实例
- TestSuite用来组装单个测试用例,可以通过addTest加载TestCase到TestSuite中,从而返回一个TestSuite实例
-
TestRunner
- 测试的执行。unitest测试框架中,通过TextTestRunner类提供的run()方法执行TestCase或TestSuite
- TestRunner可以使用图形界面、文本界面,或者返回一个特殊的值等方式表示测试执行结果
- 测试的执行。unitest测试框架中,通过TextTestRunner类提供的run()方法执行TestCase或TestSuite
-
TestFixture
- 对一个测试环境的搭建和销毁就是一个fixture,通过覆盖TestCase的setUp()和tearDown()来实现。
- 对一个测试环境的搭建和销毁就是一个fixture,通过覆盖TestCase的setUp()和tearDown()来实现。
-
TestCase
-
运行测试用例
-
setUp和tearDown
- setUp测试前准备环境
- tearDown测试后恢复环境
class MyTest(unittest.TestCase):
def setUp(self):
print("test start")
def tearDown(self):
print("test end")
class Testadd(MyTest):
def test_add1(self):
j=count(1,2)
self.assertEqual(j.add(),3)
def test_add2(self):
j=count(3,4)
self.assertEqual(j.add(),88,msg="jiao yan cuo wu ")
- setUp测试前准备环境
-
unitest.main()
- 执行所有test开头的TestCase
- 执行所有test开头的TestCase
-
TestSuite
suitt=unittest.TestSuite()
suitt.addTest(测试类名("TestCase"))
runner=unittest.TextTestRunner()
runner.run(suitt)
?
-
discover
- 根据条件自动筛选指定目录下所有测试模块,并可递归查到子目录下的测试模块
-
discover=unittest.defaultTestLoader.discover(test_dir,pattern="test*.py")
- test_dir:要测试的模块名或者目录
- pattern 表示用例匹配原则
- top_level=None:测试模块顶层目录,如没有顶层目录,默认为None
- test_dir:要测试的模块名或者目录
- 使用discover()方法,切记测试用例中需要执行的测试方法必须以test开头,否则无法加载!!!
-
使用方法
test_dir="./"discover=unittest.defaultTestLoader.discover(test_dir,pattern="test*.py")
runner=unittest.TextTestRunner()
runner.run(discover)
?
- 多目录结构,需要在每个子目录下放一个init.py文件
- 根据条件自动筛选指定目录下所有测试模块,并可递归查到子目录下的测试模块
-
执行顺序
- 默认按照0-9,A-Z,a-z,测试类、测试用例按照此顺序加载
- 执行测试顺序使用TestSuite的addTest()方法
- 默认按照0-9,A-Z,a-z,测试类、测试用例按照此顺序加载
-
setUp和tearDown
-
断言
-
跳过失败和预期失败
-
@unittest.skip(reason)
- 无条件跳过被装饰的测试方法;
- reason:理由,描述为什么跳过测试用例
- 无条件跳过被装饰的测试方法;
-
@unittest.skipIf(condition,reason)
- 如果条件为真,则继续执行执行,否则跳过被装饰的测试用例;
- 如果条件为真,则继续执行执行,否则跳过被装饰的测试用例;
-
@unittest.skipUnless(condition,reason)
- 除非条件为真,否则跳过被装饰的测试用例;
- 除非条件为真,否则跳过被装饰的测试用例;
-
@unittest.expectedFailure
- 将测试用例标记为“预期失败”:
- 如果测试执行时失败,则测试结果不计为失败;
- 将测试用例标记为“预期失败”:
-
unittest.Skip(reason)
- 如引发某种定义的异常,则跳过该测试;
- 一般可以使用TestCase.skip()或者一个跳过装饰器,而不是直接使用
- 如引发某种定义的异常,则跳过该测试;
-
@unittest.skip(reason)
-
TestFixture
-
setUpModule/tearDownModule
- 整个模块的开始和结束时执行,模块只指的是作用于一个文件,整个文件级别上只调用一次 setUp/tearDown
def setUpModule():
print(‘集成测试 >>>>>>>>>>>>>>开始‘)
def tearDownModule():
print("集成测试 >>>>>>>>>>>>>>结束")
- 整个模块的开始和结束时执行,模块只指的是作用于一个文件,整个文件级别上只调用一次 setUp/tearDown
-
setUpClass/tearDownClass
- 测试类开始和结束时执行,必须使用@classmethod 装饰器
@classmethod
def setUpClass(cls):
print("Test Class Start ----->")
@classmethod
def tearDownClass(cls):
print("Test Class End ----->")
- 测试类开始和结束时执行,必须使用@classmethod 装饰器
-
setUp/tearDown
- 测试用例开始和结束时执行
- 测试用例开始和结束时执行
-
setUpModule/tearDownModule
-
测试报告
-
测试报告运行
import test2from HTMLTestRunner import HTMLTestRunner
test_dir="./"discover=unittest.defaultTestLoader.discover(test_dir,pattern="test*.py")
if __name__=="__main__":
# runner=unittest.TextTestRunner() # runner.run(discover) fp = open("./result.html", "wb")
runner=HTMLTestRunner(stream=fp,title="测试联系",description="用例执行")
runner.run(discover)
fp.close()
-
修改报告用例的描述
- 测试类或者函数内增加doc string,即"""备注"""
- 测试类或者函数内增加doc string,即"""备注"""
-
测试报告运行
-
邮件发送
- 库 smtplib,安装pyEmail
-
实际使用
- 库 smtplib,安装pyEmail
import unittest import time,os import smtplib from email.mime.text import MIMEText from email.header import Header from email.mime.multipart import MIMEMultipart from HTMLTestRunner import HTMLTestRunner def send_report(report_fiele): smtpserverip = "smtp.126.com" username = "XXXX" password = "XXX" sender = "XXX" receviver = "XXX" #不发送附件时设置邮件主题和内容 subject = "python email test file" msg = MIMEText(‘<html><h1>你好!</html></h1>‘,‘html‘,‘utf-8‘) msg[‘Subject‘]=Header(subject,‘utf-8‘) # sendfile=open(report_fiele,‘rb‘).read() # # subject = "python email test file" # msg = MIMEText(sendfile,"base64",‘utf-8‘) # msg["Subject"] = Header(subject,"utf-8") # msg["Content-Type"] = ‘aoolication/octet-stream‘ # msg[‘Content-Disposition‘]=‘attachment;filename="result.html"‘ # msgRoot = MIMEMultipart("read") # msgRoot[‘Subject‘] = subject # msgRoot.attach(msg) smtp = smtplib.SMTP() smtp.connect(smtpserverip) smtp.login(username,password) smtp.sendmail(sender,receviver,msg.as_string()) smtp.quit() def find_new_report(result_dir): lists = os.listdir(result_dir) lists.sort(key=lambda fn:os.path.getmtime(result_dir+‘\\‘+fn)) report_fiele = os.path.join(result_dir,lists[-1]) return report_fiele if __name__=="__main__": test_dir = "./" result_dir = "./" discover = unittest.defaultTestLoader.discover(test_dir, pattern="test*.py") now = time.strftime(‘%Y-%m-%d %H_%M_%S‘) result_name = result_dir + "/" + now + ‘result.html‘ fp = open(result_name, "wb") runner=HTMLTestRunner(stream=fp,title="测试联系",description="用例执行") runner.run(discover) fp.close() new_report = find_new_report(result_dir) send_report(new_report)