1. 环境
操作系统 |
Win10 |
IDE |
Eclipse (Oxygen 4.7)+ PyDev 5.9.2 (JDK1.8) |
PyCharm Community Edition 2018.1 |
|
Python |
3.5 |
Selenium |
selenium-3.9.0-py2.py3-none-any.whl |
Openpyxl |
2.5.2 |
FirefoxDriver |
0.20.0 |
Firefox浏览器 |
59.0.2(32位) |
ChromeDriver |
2.34 |
Chrome浏览器 |
63.0.3239.84 |
还是基于上回说的参数化测试用例类来实现的,稍稍改动了一下。
2. 参数化测试用例类
由于从读入参数是字符串,因此测试用例中需要根据字符串生成webdriver。这个方法被提取到测试用例类的父类ParametrizedTestCase中,这样做不是太优雅,暂时先这样吧。
import unittest
from selenium import webdriver
class ParametrizedTestCase(unittest.TestCase):
def __init__(self, methodName='runTest', param1=None,param2=None,param3=None):
super(ParametrizedTestCase, self).__init__(methodName)
self.param1 = param1
self.param2 = param2
self.param3 = param3
@staticmethod
def parametrize(classname,casename=None, param1=None,param2=None,param3=None):
suite = unittest.TestSuite()
if casename == None:
testloader = unittest.TestLoader()
casenames = testloader.getTestCaseNames(classname)
suite = unittest.TestSuite()
for casename in casenames:
suite.addTest(classname(casename, param1, param2, param3))
else:
suite.addTest(classname(casename, param1, param2, param3))
return suite
def createDriver(self):
driver = None
if self.param1 == "Chrome":
driver = webdriver.Chrome()
elif self.param1 == "Firefox":
driver = webdriver.Firefox()
else:
driver = webdriver.Ie()
return driver
3. 测试用例类
测试用例类,就只看一下Baidu吧,Youdao类似。先判断一下,传入的参数是否为一个str对象,如果是就调用父类的createDriver()创建一个webdriver对象。
import time
from ParametrizedTestCase import ParametrizedTestCase
class Baidu(ParametrizedTestCase):
def test_baidu_search(self):
if isinstance(self.param1, str):
driver = self.createDriver()
driver.get(self.param2)
driver.find_element_by_id("kw").send_keys(self.param3)
driver.find_element_by_id("su").click()
time.sleep(5)
driver.quit()
else:
self.param1.get(self.param2)
self.param1.find_element_by_id("kw").send_keys(self.param3)
self.param1.find_element_by_id("su").click()
4. 测试集文件
4.1 用excel文件参数化
4.1.1 excel文件
一行就是一个用例,包括浏览器、url和查询用的关键字3列。
4.1.2 代码
加载excel文件,获取到其第一个sheet,遍历这个sheet,读取每一行的每个单元格的值,用以参数化用例。
import openpyxl
import unittest
from ParametrizedTestCase import ParametrizedTestCase
from Baidu import Baidu
from Youdao import Youdao
filename = r"..\excel\测试参数.xlsx"
wb = openpyxl.load_workbook(filename)
ws = wb.worksheets[0]
suite = unittest.TestSuite()
for i in range(2, ws.max_row+1):
if "baidu" in ws.cell(i,2).value:
suite.addTest(ParametrizedTestCase.parametrize(Baidu, None,
ws.cell(i,1).value, ws.cell(i,2).value, ws.cell(i,3).value))
elif "youdao" in ws.cell(i,2).value:
suite.addTest(ParametrizedTestCase.parametrize(Youdao, None,
ws.cell(i,1).value, ws.cell(i,2).value, ws.cell(i,3).value))
4.2 用xml文件参数化
4.2.1 xml文件
xml文件很简单,根节点为testsuites,其子节点为一个个测试集testsuite,这里只有一个名为search的测试集。测试集的子节点当然就是测试用例testcase,包含3个测试用例参数子节点。
Chrome
https://www.baidu.com/
Selenium
Chrome
http://www.youdao.com/
parameter
Firefox
https://www.baidu.com/
Selenium
Firefox
http://www.youdao.com/
parameter
4.2.2 代码
加载xml文件,在根节点下寻找name为search的子节点,找到后遍历该节点的子节点,即测试用例节点,获取其中的参数参数化用例。
import xml.etree.ElementTree as ET
import unittest
from ParametrizedTestCase import ParametrizedTestCase
from Baidu import Baidu
from Youdao import Youdao
xmlfile = r"..\xml\testsuite.xml"
tree = ET.parse(xmlfile)
suite = unittest.TestSuite()
for child in tree.getroot():
if child.get("name") == "search":
for grandchild in child:
if "baidu" in grandchild.find("url").text:
suite.addTest(ParametrizedTestCase.parametrize(Baidu,None,grandchild.find("explorer").text,
grandchild.find("url").text,grandchild.find("key").text))
elif "youdao" in grandchild.find("url").text:
suite.addTest(ParametrizedTestCase.parametrize(Youdao,None,grandchild.find("explorer").text,
grandchild.find("url").text,grandchild.find("key").text))
else:
break
5. 参考文献
[1] python unittest单元测试框架中,如何对一个testcase参数化,具体如何实现https://zhidao.baidu.com/question/810879195120873612.html