单元测试:
1、开发自己测试自己的代码的统称
2、python自带的单元测试框架:unittest模块
3、java里的单元测试框架是junit;php里是phpunit;都是为了让开发自测代码用的
unittest:
用unittest也可以封装接口自动化框架 UTP:
查找用例、执行用例、校验结果、发送报告
#unittest
在pycharm里运行unittest文件,需要在Run》Run...运行
例一:写并运行测试用例
import unittest
def calc(a,b):
return a//b
class MyTest(unittest.TestCase): #继承TestCase类
@classmethod
def setUpClass(cls): #所有用例执行之前运行它,只执行一次
print('运行setUpClass')
@classmethod
def tearDownClass(cls): #所有用例执行之后运行它;可以用于操作数据库,只用连接关闭一次
print('运行tearDownClass')
def setUp(self): #每条用例运行之前都会执行它;适用于每次注册测试时的操作
print('运行setup')
def tearDown(self): #每条用例运行之后都会执行它
print('运行teardown')
def test_calc1(self): #一个函数就是一条用例;函数需要以test开头,unittest.main()才能运行
#通过的用例
print('第一条用例')
res=calc(4,2)
self.assertEqual(2,res,'预期和实际不符合') #实际结果和预期结果对比,不一致的时候提示"预期和实际不符合"
#断言,这个是继承TestCase类的功能
def test_calc2(self):
#不通过的用例
print('第二条用例')
res=calc(5,1)
self.assertEqual(1,res)
self.assertIn(1,[1,2,3])
self.assertFalse(1,res) #有很多断言方法
unittest.main() #运行当前python文件里所有的测试用例,不用再实例化挨个调函数了
#生成测试报告时候,就不用这个运行了
#用例的执行顺序:按照函数名test后面的字母asii码的顺序执行的
例二:生成测试报告
import unittest
import HTMLTestRunner
import nnreport
def calc(a,b):
return a//b
class MyTest(unittest.TestCase): #继承TestCase类
def test_calc1(self): #一个函数就是一条用例;函数需要以test开头,unittest.main()才能运行
#通过的用例
'''这个是calc1描述用例''' #三个单引号里的内容,在生成的报告里就是对用例的描述
print('第一条用例')
res=calc(4,2)
self.assertEqual(2,res,'预期和实际不符合')
def test_calc2(self):
#不通过的用例
'''这个是calc2描述用例'''
print('第二条用例')
res=calc(5,1)
self.assertEqual(1,res)
test_suite=unittest.TestSuite() #定义一个测试用例的集合
# test_suite.addTest(MyTest('test_calc1')) #这里传的是某一个指定类的指定用例
test_suite.addTest(unittest.makeSuite(MyTest)) #这里传一个类名,把这个类里面所有的测试用例加到集合里面
####-----下面是一种不太好看的报告模版-----####
#需要下载HYMLTestRunner文件,并把它放到python的环境变量里
f=open('report.html','wb') #二进制 打开一个html文件,往里面写东西
runner=HTMLTestRunner.HTMLTestRunner(stream=f,title='测试报告',
description='这个是描述' ) #指定文件和title、描述
runner.run(test_suite) #运行哪些用例
f.close()
#当前文件的目录下会生成一个report.html的报告,在浏览器里打开即可
####-----下面是另一种比较好看的报告模版-----####
#需要安装nnreport模块
report=nnreport.BeautifulReport(test_suite)
report.report(description='hn的测试报告',filename='report2.html',log_path='/Users/houning/Downloads')
#log_path可以指定报告生成的路径,不写就默认在当前目录下
print(report.failure_count) #失败的次数,发邮件的时候用
print(report.success_count) #成功的次数
例三:运行多个py文件,并生成测试报告
#cases目录下建几个python文件写测试用例,测试用例代码同例一
#cases同级目录下建一个运行的py文件run_case.py,用于生成测试报告
#run_case.py文件代码如下:
import unittest
import nnreport
test_suite=unittest.TestSuite() #定义一个测试用例集合
all_case=unittest.defaultTestLoader.discover('cases','*.py') #传一个目录,查找目录下的用例
for case in all_case: #循环cases目录下的py文件
test_suite.addTests(case) #括号是一个python文件,这里用的是addTests,即添加此py文件里的所有类的用例
report = nnreport.BeautifulReport(test_suite)
report.report(description='这是测试报告', filename='case_report.html')
#这样就把测试用例文件里所有的用例都生成报告了