parameterized 参数化


数据驱动应用

    数据驱动应用是自动化测试里的一个重要功能,虽然不使用单元测试框架也一样可以写测试代码和使用数据文件,但这意味着放弃了单元测试框架
提供给我们的所有功能,如 测试用例断言、 灵活的运行机制、 结果统计和测试报告等。 这些都要去自己去实现。显然非常麻烦。 所以抛开测试框架
谈数据驱动是没有意义的。

    下面我们来讨论一下数据驱动的使用, 以及 unittest 关于参数化的库
    数据驱动:
    由于大多数文章和资料都把 “读取数据文件” 看做数据驱动的标志,所以我们来讨论一下这个问题。 我们创建一个 baidu_data.csv
文件作为数据驱动。数据如下:

        name    search_key
        case1   selenium
        case2   python
        case3   unittest
        case4   pytest

    接下来创建 test_baidu_data.py ,内容如下
《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《

import csv
import codecs
import unittest
from time import sleep
from itertools import islice
from selenium import webdriver
from os.path import dirname, abspath


class TestBaidu(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        cls.driver = webdriver.Firefox()
        cls.baseUrl = "http://www.baidu.com"

    @classmethod
    def tearDownClass(cls):
        cls.driver.quit()

    def baidu_search(self, search_key):
        self.driver.get(self.baseUrl)
        self.driver.find_element_by_id("kw").send_keys(search_key)
        self.driver.find_element_by_id("su").click()

        sleep(2)

    def test_search(self):
        baseDir = dirname(dirname(abspath(__file__)))
        dataFileDir = baseDir + '/datafile'
        dataFilePath = dataFileDir + "/datafile.csv"
        print(dataFilePath)

        with codecs.open(dataFilePath, 'r', 'utf_8_sig') as f:
            data = csv.reader(f)
            for line in islice(data, 1, None):
                search_key = line[1]
                self.baidu_search(search_key)

if __name__ == '__main__':
    unittest.main()

 



》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
    
---------------------运行结果----------------------------------------------
    D:\gupan\myObject\my_object/datafile/datafile.csv
    .
    ----------------------------------------------------------------------
    Ran 1 test in 18.463s

    OK

    ***Repl Closed***
 ----------------------------------------------------------------------------
 
    这样做似乎没什么问题,但是所有数据被当做一条测试用例执行了。 而 unittest 是以 “test” 开头的测试方法作为一个用例,而这里有四条数据。
而且,这4条数据,如果有一条执行失败,那么整个测试用例就失败。 所以这样划分并不合理,应该每一条数据一个测试用例。
    
    思考一个问题: 在 UI 自动化测试中,站在用户的角度去考虑,用户在什么场景下会使用大量数据呢? 其实, 输入大量数据的功能很少,如果整个
系统需要用户输入大量数据,那么可能用户体验会很不好! 大多数时候,系统只是允许输入用户名, 密码 和个人信息,或关键字等。
    

    Parameterized 是 Python 的一个参数化库,同时支持, unittest、 None 和 Pytest 单元测试框架。
    pip install parameterized
《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《    

import csv
import codecs
import unittest
from time import sleep
from itertools import islice
from selenium import webdriver
from os.path import dirname, abspath
from parameterized import parameterized


class TestBaidu(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        cls.driver = webdriver.Firefox()
        cls.baseUrl = "http://www.baidu.com"

    @classmethod
    def tearDownClass(cls):
        cls.driver.quit()

    def baidu_search(self, search_key):
        self.driver.get(self.baseUrl)
        self.driver.find_element_by_id("kw").send_keys(search_key)
        self.driver.find_element_by_id("su").click()

        sleep(2)

    @parameterized.expand([
        ("case1", "selenium"),
        ("case1", "python"),
        ("case1", "unittest"),
        ("case1", "pytest"),
    ])
    def test_search(self, name, search_key):
        self.baidu_search(search_key)
        self.assertEqual(self.driver.title, search_key + "_百度搜索")


if __name__ == '__main__':
    unittest.main(verbosity=2)

 



》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
 -------------------------运行结果---------------------------------------------
test_search_0_case1 (__main__.TestBaidu) ... ok
test_search_1_case1 (__main__.TestBaidu) ... ok
test_search_2_case1 (__main__.TestBaidu) ... ok
test_search_3_case1 (__main__.TestBaidu) ... ok

----------------------------------------------------------------------
Ran 4 tests in 19.188s

OK

***Repl Closed***
 ----------------------------------------------------------------------------

    在 @paramiterized.expand() 中, 每个元组都被认为是一条测试用例。 元组中的数据为该条测试用例变化的值。在测试用例
中,通过参数来取每个元组中的数据。
    参数化会自动多个加上 '0', '1', '2', '3' 来区分每条用例, 在元组中定义的 'case1', 'case2', 'case3', 'case4'
也会作为每条测试用例名称的后缀出现,
    注意:test_search() 方法实际上 只用了一个参数: search_key


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM