企业中web自动化测试不仅仅是面向过程式的编写,我们需要将其封装写在类中,并在运行后生成测试报告,目前市面上比较流行的框架有unintest单元测试框架以及pytest框架,今天我们来了解下unittest框架的使用及原理!
首先我们可以简单的看下一个小的demo:
通过上图,首先我们看到我们要使用unittest的框架,我们需要先继承这个框架,(关于类与方法的模块,同学们可以参考之前课程python方法及面向对象了解),然后我们在执行的时候用的是下面的main方法进行运行的。首先我们会观察到,上面三个方法怎么只允许了两个呢?还有问什么我们执行方法的顺序也不是从上到下执行的呢?这就涉及到unittest的运行原理了,unittest运行只会运行类中的以test开头的方法当做测试用例,其他方法不会执行。其次执行的顺序是根据[0-9]–>[A-Z]–>[a-z]的顺序执行的。
if __name__ == '__main__':
unittest.main(verbosity=2)
我们可以在main方法内添加一个verbosity参数可以看到用例的执行顺序。
unittest中还有几个固定方法以便于我们测试用到的:
setUpClass:所有用例的前置条件(执行用例前运行一次这个方法)
tearDownClass:所有用例执行完后(所有用例运行结束后执行一次这个方法)
setUp:单个前置条件(每执行一个用例前就运行一次该方法,有多少用例就执行多少次)
tearDown:单个用例执行完后(每执行一个用例后就运行一次该方法,有多少用例就执行多少次)
由上图所示,我们可以看出类前置条件与结束条件,上面加了一个装饰器,类方法@classmethod,意思是类执行维度的方法,这个装饰器是必须的。类前置与后置分别是在最前与最后执行,单个用例的前置与后置则是有两个用例分别执行了两次。每个前置与后置,个人在使用时可酌情编写,并非强制需要用到这些方法!
接下来我们用实际的selenium做个demo:
import time,unittest
from selenium import webdriver
class TestDemo(unittest.TestCase):
@classmethod
def setUpClass(cls): # 类前置
cls.driver = webdriver.Chrome() # 打开浏览器
cls.driver.maximize_window() # 窗口最大化
cls.driver.get('https://www.baidu.com/') # 打开百度
print("执行开始-----------")
def setUp(self):
self.driver.implicitly_wait(3) # 单用例前置 隐式等待3秒
def tearDown(self): # 单用例后置
self.str1 = TestDemo.timeapp() # 调用timeapp方法
# 用例结束后将当前屏幕截屏保存并命名
self.driver.save_screenshot(r'./{}'.format('测试' + self.str1 + '.png'))
@classmethod
def tearDownClass(cls): # 类后置
cls.driver.quit() # 退出浏览器
@classmethod
def timeapp(self):
date = time.localtime() #获取当前时间
str1 = time.strftime('%Y%m%d%H%M%S',date) #将当前时间戳转为字符串
return str1
def test_001(self):
self.driver.find_element_by_id('kw').send_keys('零基础Python自动化')
self.driver.find_element_by_id('su').click()
time.sleep(5)
if __name__ == '__main__':
unittest.main(verbosity=2)
根据上述代码我们可以看到先执行类前置打开了浏览器,然后隐式等待3秒,打开百度,输入"零基础Python自动化"后点击搜索,保存屏幕,退出了浏览器。
测试报告的生成
我们既然可以执行了自动化测试用例,那么我们到最后应当生成一个测试报告,这样我们能够直观的看到用例执行了多少,成功失败了多少。
测试报告的生成需要引用一个外部的包HTMLTestRunner,同学们可自行网上下载,HTMLTestRunner下载地址:
https://pan.baidu.com/s/109CsITMEm5Vqgdw6Yz68HA
提取码:eeji
接下来我们讲下如何与unittest结合生成测试报告。首先我们执行用例并生成测试报告,需要导入这个包中的HTMLTestRunner类,然后创建一个测试套件,添加我们需要执行的测试用例,然后执行我们的测试用例并生成测试报告!
if __name__ == '__main__':
# unittest.main(verbosity=2) #unittest.main()与htmltestrunner不能同时存在
testsuit = unittest.TestSuite() #创建测试集
# testsuit.addTests([TestDemo('test_001'), TestDemo('test_002')]) # 添加需要报告的用例列表
testsuit.addTests(unittest.TestLoader().loadTestsFromTestCase(TestDemo)) # 添加需要报告的整个类的用例
go = open(r'./report.html', 'wb') # 定义报告生成的路径
runner = HTMLTestRunner(stream=go, title='测试报告', description='随便啥') # 定义报告名,描述等
runner.run(testsuit) # 生成报告
当我们运行后当前路径下会生成一个report.html文件,复制路径用网页打开,我们会看到这样的一个测试报告
有些同学可能会注意到,我们运行了以上的代码并没有生成测试报告,但是代码执行并没有报错,这里有一个坑,小编踩了多次才注意到python执行的方式有多种,unittest执行,py文件执行以及pytest执行方式,我们需要在pycharm修改下执行方式
点击进入edit
我们选择上面一种Python,点击做上架"+"在右边script path选择我们这次的文件路径,以及下面对应的Project工程,并在左边栏目把之前Python tests中的文件记录清除,然后应用保存,这个时候在点击运行,我们就可以看到了测试报告的生成!
关于unittest框架及测试报告的生成,我们就了解这些,如碰到问题可联系小编,一起共同交流沟通!
关注下方,学习更多知识!