unittest框架解析
大家好,我是bug郭,一名双非科班的在校大学生。对C/JAVA、数据结构、Spring系列框架、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流
作者简介:
- CSDN java领域新星创作者blog.csdn.net/bug…
- 掘金LV3用户 juejin.cn/user/bug…
- 阿里云社区专家博主,星级博主,developer.aliyun.com/bug…
- 华为云云享专家 bbs.huaweicloud.com/bug…
@TOC
本章目标
本章主要是学习单元测试框架
untittest
,这里的单元测试指的是对最小的软件设计单元(模块)进行的测试验证,在UI
自动测试里,这些单元测试主要针对的是UI
界面的功能进行的自动化测试.这里的unittest
并不是java里的unit
单元测试框架!
- unittest框架解析
- 批量处理脚本
- unittest断言
- HTML报告生成
- 异常捕捉和错误截图
- 数据驱动
unittest框架解析
unittest
是python的单元测试框架,主要作用如下:
- 提供用例的组织和执行
当我们的测试用例比较庞大时就需要考虑用例的组织和执行顺序,unittest就可以帮助我们!
- 提供丰富的比较方法
我们用例执行结束后要通过比较用例执行的实际结果和预期结果(断言),从而确定用例是否顺利通过!
例如判断相等/不相等,包含/不包含,True/False
- 提供丰富的日志
当测试用例执行失败时可以清晰的抛出和保存用例执行失败的原因!日志提供了丰富的执行结果:用例总执行时间,失败用例数,成功用例数
unittest里的四个重要概念:
- Test Fixture
对一个测试环境的搭建和销毁就是一个
fixture
,主要通过setUp()
和tearDown()
覆盖方法实现!
setUP()
:对测试环境的搭建,比如获取浏览器驱动,数据库建立连接初始化等等tearDown()
: 对测试环境的销毁,比如关闭浏览器,关闭数据库的连接,清楚数据库中的数据等
- Test Case
Test Case的实例就是一个测试用例.测试用例就是完整的一个测试流程,包括测试环境的搭建(setUp),实现测试过程的代码,环境的还原(tearDown).一个测试用例就是一个测试单元,可以对某个测试功能进行验证!
- Test Suite
一个功能的验证往往需要多个测试用例,可以把多个测试用例集合在一起执行,这个就产生了测试套件TestSuite的概念。Test Suit测试套件用来将多个测试用例组装在一起
- Test Runner
测试的执行也是非常重要的一个概念,在unittest框架中,通过TextTestRunner类提供的run()方法来执行test suite/test case。
unittest框架测试脚本示例:
# 导入unittest框架
import unittest
from selenium import webdriver
import time
# 继承TestCase这个类就会使用unittest框架来组织测试用例!
class Baidu1(unittest.TestCase):
def setUp(self) -> None: # 覆盖setUP方法,测试环境搭建!
print('---setUp---')
self.driver = webdriver.Chrome() # 获取到浏览器驱动
self.url = "http://www.baidu.com/" #测试的web链接
self.driver.maximize_window() # 浏览器最大化!
time.sleep(3)
def tearDown(self) -> None: # 覆盖tearDown方法,测试环境销毁!
print('---tearmDown---')
self.driver.quit() # 关闭浏览器,释放驱动!
# 测试用例
def test_baidu1(self):
self.driver.get(self.url) # 打开百度链接
self.driver.find_element_by_id('kw').send_keys('java') # 定位到搜索框,输入文本
time.sleep(2)
self.driver.find_element_by_id('su').click() # 定位到搜索按钮点击!
time.sleep(3)
def test_baidu2(self):
self.driver.get(self.url) # 重新打开百度链接!
self.driver.find_element_by_link_text('新闻').click() # 打开新闻导航地址
time.sleep(2)
for window in self.driver.window_handles:
self.driver.switch_to_window(window)
if window.title =='百度新闻——海量中文资讯平台':
break
self.driver.find_element_by_name('word').send_keys('赣州')
time.sleep(2)
self.driver.find_element_by_xpath('//*[@id="s_btn_wr"]').click()
time.sleep(2)
#滑动到低端!
js = 'var j = document.documentElement.scrollTop=10000'
self.driver.execute_script(js)
time.sleep(3)
#滑动到顶端
js = 'var j = document.documentElement.scrollTop=0'
self.driver.execute_script(js)
time.sleep(3)
def baidu3(self):
self.driver.get('http://baidu.com/')
self.driver.find_element_by_partial_link_text('hao').click()
time.sleep(2)
if __name__=='__main__':
unittest.main() # unittest框架提供了全局的main方法
这里
unittest
提供了全局的main
方法,main
方法中会将test_
开头的方法进行组织,然后调用main
方法就可以执行所有的以test_
开头的方法!
新窗口,无法定位元素
注意事项
当我们在当前页面的基础上开了一个新的窗口页面,我们如果要对新的窗口元素进行定位,我们需要将窗口更新,才能定位到新的窗口元素
# 进行窗口定位之前要time.sleep() 保证窗口已经跳转过来!
for handle in self.driver.window_handles:
self.driver.switch_to_window(handle) # 转换到新的窗口!
if hanle.title =='新窗口title':
break # 定位到窗口就退出循环!
#进行新窗口元素的定位!
- 点赞
- 收藏
- 关注作者
评论(0)