之前学习了selenium的脚本录制和webdriver的API,在进行脚本录制导出的脚本中,多了很多代码,这些代码就是unittest测试框架;
unittest框架介绍
unittest是Python单元测试框架,它提供了创建测试用例,测试套件以及批量执行的方案,在安装Python之后就自带了unittest,直接import unittest就可以使用;
unittest是可以对程序最小模块的一种敏捷化的测试,利用单元测试框架,创建一个类,这个类继承unittest的TestCase,这样可以把每个case看成是一个最小的单元,由测试容器组织起来,直接执行,并且可以引入测试报告;
如图:
Test Fixture:测试固件,初始化和清理测试环境,例如下面实现的setUp和tearDown都是测试固件,每个类中都应该抱哈这两个函数;
test case:单元测试用例,TestCase是编写单元测试用例最常用的类;
test suite:单元测试用例集合,TestSuite是最常用的类,测试方法组合在一起就是测试套件;
test runner:执行单元测试,批量执行测试套件,要注意不同于生成测试报告的runner;
test report:生成测试报告(可以省略)
例如我们实现一个脚本:
from selenium import webdriver
import time
import unittest
class Baidu1(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Firefox()
self.driver.implicitly_wait(30)
self.base_url = "http://www.baidu.com"
self.verificationErrors=[]
self.accept_next_alert = True
def tearDown(self):
self.driver.quit()
def test_hao(self):#实现点击hao123进入
driver = self.driver
driver.get(self.base_url)
driver.find_element_by_link_text("hao123").click()
time.sleep(8)
def test_wang(self):
driver = self.driver
driver.get(self.base_url)
driver.find_element_by_id("kw").send_keys("王一博")
driver.find_element_by_id("su").click()
time.sleep(6)
def test_bu(self):
driver = self.driver
driver.get(self.base_url)
driver.find_element_by_id("kw").send_keys("布拉格")
driver.find_element_by_id("su").click()
time.sleep(6)
if __name__ == "__main__":
unittest.main(verbosity=2)
#增加verbosity参数,这样测试的结果就会更加详细
对这个代码进行一个解释,Setup和tearDown方法是测试固件,是不能缺少的(相当于C++中的构造函数和析构函数),接下来分别实现各个测试用例,我这里实现了三个测试用例,也就是点击hao123进入、搜索王一博进入、搜索布拉格进入;这里要注意,每次执行一个用例,先调用setUp函数,然后执行,然后调用tearDown函数;
编写测试用例的函数必须以test_开头进行命名,执行时会主动执行这些测试用例,按时类中定义的方法不会主动执行,类中函数的执行顺序以ASCII码值进行排序;
这里要介绍这个verbosity参数:
在主函数中直接调用main(),在main中加入verbosity参数,测试结果会更详细;
verbosity=0:静默模式,只能获得总得测试用例和总的结果,比如总共5个测试用例,失败1,成功4
verbosity=1:默认模式,在每个成功的用例面前有个".",每个失败的用例前有个"F";
verbosity=2:详细模式,测试结果会显示每个测试用例的所有信息
我们知道上述需要编写多个测试用例才能对软件某个功能进行比较完整的测试,这些相关测试用例称为一个测试用例集,在unittest中用TestSuite类来表示;
批量执行脚本
- addTest
例如我们编写了TestBaidu1和TestBaidu2两个文件,怎么同时执行这两个文件,例如:
TestBaidu1:
from selenium import webdriver
import time
import unittest
class Baidu1(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Firefox()
self.driver.implicitly_wait(30)
self.base_url = "http://www.baidu.com"
self.verificationErrors=[]
self.accept_next_alert = True
def tearDown(self):
self.driver.quit()
def test_hao(self):#实现点击hao123进入
driver = self.driver
driver.get(self.base_url)
driver.find_element_by_link_text("hao123").click()
time.sleep(8)
def test_wang(self):
driver = self.driver
driver.get(self.base_url)
driver.find_element_by_id("kw").send_keys("王一博")
driver.find_element_by_id("su").click()
time.sleep(6)
def test_bu(self):
driver = self.driver
driver.get(self.base_url)
driver.find_element_by_id("kw").send_keys("布拉格")
driver.find_element_by_id("su").click()
time.sleep(6)
if __name__ == "__main__":
unittest.main(verbosity=2)
#增加verbosity参数,这样测试的结果就会更加详细