Selenium+Python:在一个浏览器窗口测试多个文件中的测试用例

1.       环境

操作系统

Win10

IDE

PyCharm Community 2018.1

Eclipse (Oxygen 4.7)+ PyDev 5.9.2 (JDK1.8)

Python

3.5

Selenium

selenium-3.9.0-py2.py3-none-any.whl

ChromeDriver

2.34

Chrome浏览器

63.0.3239.84

  

    在一个浏览器窗口测试多个文件中的测试用例,是一个朋友的需求找我讨论,首先想到的就是setUpModule/ tearDownModule,但朋友说试过了貌似不行。我自己也试了一下,感觉无论是setUpClass/tearDownClass还是setUpModule/ tearDownModule,和之前以为的有些区别,而且网上,包括官网,也搜不到有用的例子。 

    在试的过程中,我意识到,如果要实现这个需求,那TestSuite的addTest()必须可以接受除测试用例或者测试类之外的参数,最起码可以把共用的webdriver带入到测试用例中。于是搜到了参考文献中的[1],在这基础上,实现了这个需求。

  

2.       参数化测试用例类

    这个类基本上是从参考文献[1]中抄过来的,只是增加了一个参数化方法,原来只有一个参数化测试用例类的方法,加了一个参数化用例的,以方便实现组织测试集时不需要每个测试用例类中所有用例的情况。另外为带入webdriver对象、url字符串和搜索关键字,参数化方法都增加了两个参数。

import unittest

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_case(classname,casename, param1=None,param2=None,param3=None):
        suite = unittest.TestSuite()
        suite.addTest(classname(casename, param1=param1, param2=param2, param3=param3))
        return suite

    @staticmethod
    def parametrize_class(testcase_klass, param1=None,param2=None,param3=None):
        testloader = unittest.TestLoader()
        testnames = testloader.getTestCaseNames(testcase_klass)
        suite = unittest.TestSuite()
        for name in testnames:
            suite.addTest(testcase_klass(name, param1=param1, param2=param2, param3=param3))
        return suite


3.       测试用例文件

3.1   Youdao

    测试用例类Youdao只包含了一个测试用例test_youdao_search,简单地键入关键字,点击【翻译】按钮。

from ParametrizedTestCase import ParametrizedTestCase

class Youdao(ParametrizedTestCase):
    def test_youdao_search(self):
        self.param1.get(self.param2)
        self.param1.find_element_by_id("translateContent").clear() 
        self.param1.find_element_by_id("translateContent").send_keys(self.param3)
        self.param1.find_element_by_css_selector("form#form>button").submit()


3.2   Baidu

    同样的,测试用例类Baidu也只包含了一个测试用例test_baidu_search,简单地键入关键字,点击【百度一下】按钮。

from ParametrizedTestCase import ParametrizedTestCase

class Baidu(ParametrizedTestCase):
    def test_baidu_search(self):
        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.       测试集文件

    调用测试集的addTest()组织测试集,其参数为测试用例类的静态成员方法,继承自参数化类,Baidu用了参数化用例方法,Youdao用了参数化测试用例类方法。然后用HTMLTestRunner出测试报告。


import unittest
import time
from selenium import webdriver
from HTMLTestRunner import HTMLTestRunner

from ParametrizedTestCase import ParametrizedTestCase
from Baidu import Baidu
from Youdao import Youdao

driver = webdriver.Chrome()
baiduurl = "https://www.baidu.com/"
youdaourl = "http://www.youdao.com/"
baidukey = "Selenium"
youdaokey = "parameter"

suite = unittest.TestSuite()
suite.addTest(ParametrizedTestCase.parametrize_case(Baidu,"test_baidu_search", param1=driver,param2=baiduurl,param3=baidukey))
suite.addTest(ParametrizedTestCase.parametrize_class(Youdao, param1=driver,param2=youdaourl,param3=youdaokey))

now = time.strftime("%Y-%m-%d %H_%M_%S")
filename = ".\\" + now + "result.html"
fp = open(filename, "wb")
runner = HTMLTestRunner(stream=fp,title="搜索测试报告",description="用例执行情况:")
runner.run(suite)

time.sleep(5)
driver.quit()

    需求是实现了,但总觉得应该有更好的方法。先记录在这儿吧,也算是一种思路吧,或许应该再研究研究setUpClass/ tearDownClass和setUpModule/ tearDownModule。

  

5.       参考文献

[1] python unittest单元测试框架中,如何对一个testcase参数化,具体如何实现https://zhidao.baidu.com/question/810879195120873612.html



阅读更多
个人分类: 自动化测试
想对作者说点什么? 我来说一句

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

关闭
关闭
关闭