python单元测试简介
功能代码demo1.py
class MyClass():
def __init__(self,x,y):
self.x = x
self.y = y
def add(self):
return self.x + self.y
def sub(self):
return self.x - self.y
单元测试框架unittest
import unittest
from unittset_demo.demo1 import MyClass
class MyclassTest(unittest.TestCase):
def setUp(self) -> None:
'''
测试之前的准备工作
:return:
'''
self.clac = MyClass(4,3)
def tearDown(self) -> None:
'''
测试之后的收尾
如关闭数据库
:return:
'''
pass
def test_add(self):
ret = self.clac.add()
self.assertEqual(ret,9)
def test_sub(self):
ret = self.clac.sub()
self.assertEqual(ret,-1)
if __name__ == '__main__':
suite = unittest.TestSuite()
suite.addTest(MyclassTest('test_add'))
suite.addTest(MyclassTest('test_sub'))
runner = unittest.TextTestRunner()
runner.run(suite)
一般测试方法必须以test_开头,里面可以写我们需要测试的业务逻辑
setUp就是帮我们做测试前的准备工作,比如实例化等,
tearDown可以帮我们关闭数据库等收尾操作,
self.assertEqual()将我们的结果和运行的实际结果进行比对,
suite就是我们的测试集,之后添加测试用例,用runner实例化运行。
python生成测试报告HTMLTestRunner
HTMLTestRunner是python第三方库,专门用来生成测试报告的,下载地址:http://tungwaiyip.info/software/HTMLTestRunner.html
然后这个是不支持python3语法的,要自己改一下代码,具体更改如下
第94行: import StringIO 改为 import io
第539行:self.outputBuffer = StringIO.StringIO() 改为self.outputBuffer = io.BytesIO()
第642行:if not rmap.has_key(cls): 改为 if not cls in rmap:
第772行:ue = e.decode('latin-1') 改成 ue = e
第776行:uo = o.decode ('latin-1') 改成 uo=o
第768行:uo = o 改成 uo = o.decode('utf-8')
第774行:ue = e 改成 ue = e.decode('utf-8')
第631行:print >>sys.stderr, '\nTime Elapsed: %s' % (self.stopTime-self.startTime) 改成 print('\nTime Elapsed: %s' % (self.stopTime-self.startTime),file=sys.stderr)
第118行:self.fp.write(s) 改为 self.fp.write(bytes(s,'UTF-8'))
python代码
调用的代码见上个章节内容。
import unittest
from selenium import webdriver
import sys
from autoTest import baseUtil
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver import ActionChains
import time
from time import sleep
from HTMLTestRunner import *
from autoTest.testBug import testBug
class testBugReport(unittest.TestCase):
# def setUp(self):
# pass
#
# def tearDown(self):
# pass
##登錄
def test_testLogin_tc0(self):
print(111)
t1=testBug()
self.assertEqual(t1.login(), True)
##
def test_tc_fd_1(self):
print("test_tc_fd_1 start")
self.assertEqual(testBug().tc_fd_1(), True)
print("test_tc_fd_1 end")
def test_tc_rv_1(self):
print("test_tc_rv_1 start")
self.assertEqual(testBug().tc_rv_1(), True)
print("test_tc_rv_1 end")
def test_tc_rv_2(self):
print("test_tc_rv_2 start")
self.assertEqual(testBug().tc_rv_2(), True)
print("test_tc_rv_2 end")
def test_tc_rv_3(self):
print("test_tc_rv_3 start")
self.assertEqual(testBug().tc_rv_3(), True)
print("test_tc_rv_3 end")
if __name__ == '__main__':
print("测试套件开始。"+time.strftime("%Y%m%d_%H%M%S"))
testsuit = unittest.TestSuite()
# testsuit.addTest(testBugReport('test_testLogin_tc0')) #登录不單獨測試
testsuit.addTest(testBugReport('test_tc_fd_1'))
testsuit.addTest(testBugReport('test_tc_rv_1'))
testsuit.addTest(testBugReport('test_tc_rv_2'))
testsuit.addTest(testBugReport('test_tc_rv_3'))
#按照一定格式获取当前时间,%Y表示带世纪的年(2019),%y表示不带世纪的年(19),time.strftime()表示获得当前时间并格式化字符串
now = time.strftime("%Y%m%d_%H%M%S")
#将当前时间加入到报告文件名称中
filename = r'./'+now+'result.html'
#定义测试报告存放路径,通过open()方法以二进制写模式('wb')打开当前目录下的result.heml,如果没有,则自动创建。
fp = open(filename,'wb')
#定义测试报告,调用HTMLTestRunner模块下的HTMLTestRunner类,stream 指定测试报告文件,title 定义测试报告的标题,description 定义测试报告的副标题
runner = HTMLTestRunner(stream=fp,title='自动化测试报告',description='用例执行情况:')
#通过HTMLTestRunner的run()方法来运行测试套件中的测试用例
runner.run(testsuit)
#关闭测试报告
fp.close()
print("测试套件完成。"+time.strftime("%Y%m%d_%H%M%S"))
测试报告
测试报告是html文件。
成功的报告:
失败的测试报告,点击可以看到报错信息