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