Selenium+Python:excel、xml参数化测试用例

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个测试用例参数子节点。

<?xml version="1.0" encoding="utf-8"?>
<testsuites>
    <testsuite name="search">
        <testcase>
            <explorer>Chrome</explorer>
            <url>https://www.baidu.com/</url>
            <key>Selenium</key>
        </testcase>
        <testcase>
            <explorer>Chrome</explorer>
            <url>http://www.youdao.com/</url>
            <key>parameter</key>
        </testcase>
        <testcase>
            <explorer>Firefox</explorer>
            <url>https://www.baidu.com/</url>
            <key>Selenium</key>
        </testcase>
        <testcase>
            <explorer>Firefox</explorer>
            <url>http://www.youdao.com/</url>
            <key>parameter</key>
        </testcase>
     </testsuite>
</testsuites>


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
阅读更多
个人分类: 自动化测试
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭