- 重要概念
- TestCase
- 一个TestCase就是一个测试用例,一个完整的测试流程,包括环境准备(setUp),实现过程(run),环境恢复(tearDown)
- TestSuite
- TestSuite用来组装单个测试用例,可以通过addTest加载TestCase到TestSuite中,从而返回一个TestSuite实例
- TestRunner
- 测试的执行。unitest测试框架中,通过TextTestRunner类提供的run()方法执行TestCase或TestSuite
- TestRunner可以使用图形界面、文本界面,或者返回一个特殊的值等方式表示测试执行结果
- TestFixture
- 对一个测试环境的搭建和销毁就是一个fixture,通过覆盖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 ")
- TestSuite
suitt=unittest.TestSuite()
suitt.addTest(测试类名("TestCase"))
runner=unittest.TextTestRunner()
runner.run(suitt)
- discover
- 根据条件自动筛选指定目录下所有测试模块,并可递归查到子目录下的测试模块
- discover=unittest.defaultTestLoader.discover(test_dir,pattern="test*.py")
- top_level=None:测试模块顶层目录,如没有顶层目录,默认为None
- 使用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()方法
- 断言
- 跳过失败和预期失败
- @unittest.skipIf(condition,reason)
- 如果条件为真,则继续执行执行,否则跳过被装饰的测试用例;
- @unittest.skipUnless(condition,reason)
- @unittest.expectedFailure
- unittest.Skip(reason)
- 一般可以使用TestCase.skip()或者一个跳过装饰器,而不是直接使用
- TestFixture
- setUpModule/tearDownModule
- 整个模块的开始和结束时执行,模块只指的是作用于一个文件,整个文件级别上只调用一次 setUp/tearDown
def setUpModule():
print('集成测试 >>>>>>>>>>>>>>开始')
def tearDownModule():
print("集成测试 >>>>>>>>>>>>>>结束")
- setUpClass/tearDownClass
- 测试类开始和结束时执行,必须使用@classmethod 装饰器
@classmethod
def setUpClass(cls):
print("Test Class Start ----->")
@classmethod
def tearDownClass(cls):
print("Test Class End ----->")
- 测试报告
- 测试报告运行
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,即"""备注"""
- 邮件发送
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)