自动化测试脚本之数据驱动测试

一、前言

Unittest第三方库parameterized类似Unittest的DDT、[email protected],可以实现参数化用户数据驱动,传入多组参数,自动生成多个用例,避免写多个方法

二、使用parameterized实现数据驱动

  • 方式一:将参数写到方法上(parameterized)
    代码如下:
import csv
import unittest
from time import sleep
from unittest import TestCase
# import unittest
# 修饰的类,参数是给所有的用例使用的
# import paramunittest
# import parameterized
from parameterized import parameterized
from selenium import webdriver

from logModule.log1 import myLog
from regCSV2.regCSV import register


class regTest(TestCase):
    def setUp(self):
        self.md = regTest()

    def tearDown(self):
        self.md = None

    @parameterized.expand([
        ('yangyang1','','123456','123456','请设置邮箱'),
        ('yangyang2','abcdeqq.com','123456','123456','无效的邮箱地址'),
        ('yangyang3','@sina.com','123456','123456','无效的邮箱地址'),
        ('yangyang4','abcde@163com','123456','123456','无效的邮箱地址')
    ])
    def testReg(self,username,email,password,repassword,exurl):
    	# 将所有参数整个成一个列表
        data = [username,email,password,repassword,exurl]
        driver = webdriver.Chrome()
        # 这是实例化一个注册对象
        reg = register()
        driver.get("http://localhost:8088/XXX/index.php")
        # 调用注册对象的注册方法
        reg.register1(driver,data)
        expectValue = driver.find_element_by_css_selector('#register-form > div > dl:nth-child(2) > dd > span > font').text

        # 断言 + 打印日志
        try:
            # print(expectValue)
            self.assertEqual(data[4], expectValue, "预期结果和实际结果不一致")
            myLog(__file__, self._testMethodName, expectValue, data[4], "用例成功")
        except:
            myLog(__file__, self._testMethodName, expectValue, data[4], "用例失败")
        driver.quit()

if __name__ == "__main__":
    unittest.main(verbosity=1)
  • 方法二:将方法写到类上(paramunittest)
    代码如下:
import csv
import unittest
from time import sleep
from unittest import TestCase
# import unittest
import paramunittest
from selenium import webdriver
from regCSV2.regCSV import register

@paramunittest.parametrized(
    ('yangzxc22','[email protected]','123456','123456','http://localhost:8088/XXX/index.php?c=user&a=register&step=submit'),
    ('yangzxc92','[email protected]','123456','123456','http://localhost:8088/XXX/index.php?c=user&a=register&step=submit'),
    ('yangzxc6692','[email protected]','123456','123456','http://localhost:8088/XXX/index.php?c=user&a=register&step=submit'),
    ('yangzxc2','[email protected]','123456','123456','http://localhost:8088/XXX/index.php?c=user&a=register&step=submit')
)
class regTest(TestCase):
    def setParameters(self,username,email,password,repassword,exurl):
        self.username = username
        self.email = email
        self.password = password
        self.repassword = repassword
        self.exurl = exurl


    def testReg(self):
        driver = webdriver.Chrome()
        driver.get("http://localhost:8088/XXX/index.php?c=user&a=register")
        driver.find_element_by_id("username").send_keys(self.username)
        driver.find_element_by_id("email").send_keys(self.email)
        driver.find_element_by_id("password").send_keys(self.password)
        driver.find_element_by_id("repassword").send_keys(self.repassword)
        driver.find_element_by_id("captcha").send_keys("aaaa")
        driver.find_element_by_link_text("立即注册").click()
        actualValue = driver.current_url
        print(actualValue)  # 实际结果
        self.assertEqual(self.exurl, actualValue, "预期结果和实际结果不一致")
        driver.quit()



if __name__ == "__main__":
    unittest.main(verbosity=1)

三、使用DDT模块实现数据驱动

import csv
import unittest
from time import sleep
from unittest import TestCase
# import unittest
from ddt import ddt,data
from selenium import webdriver

from regCSV2.ExcelUtil import ExcelUtil
from regCSV2.regCSV import register

@ddt
class regTest(TestCase):
    filePath = r"C:\XXX\regRepassword.xls"
    # 调用转换为字典的方法,也可调用转换为列表的,根据自己的需要可以修改ExcelUtil的代码。
    data1 = ExcelUtil(filePath, "regRepassword").dict_data() 

    def setUp(self):
        self.md = regTest()

    def tearDown(self):
        self.md = None

    @data(*data1) # data1的数据会传给aa
    def testReg(self,aa):
    	# 将所有数据整合成一个列表
        datas = [aa["username"],aa["email"],aa["password"],aa["repassword"]]
        print(datas)
        driver = webdriver.Chrome()
        reg = register()
        driver.get("http://localhost:8088/verydows/index.php")
        # 调用注册的方法
        reg.register1(driver,datas)
        expectValue = driver.find_element_by_xpath('//*[@id="register-form"]/div/dl[4]/dd/span/font').text
        self.assertEqual(aa["expected"], expectValue, "预期结果和实际结果不一致")

        driver.quit()


if __name__ == "__main__":
    unittest.main()
  • ExcelUtil模块的代码如下:
#这个模块的作用是将excel中数据读入并转化
import xlrd
class ExcelUtil():
    def __init__(self, excelPath, sheetName="Sheet1"):
        self.data = xlrd.open_workbook(excelPath)
        self.table = self.data.sheet_by_name(sheetName)
        # 获取第一行作为key值
        self.keys = self.table.row_values(0)
        # print(self.keys)
        # 获取总行数
        self.rowNum = self.table.nrows
        # print(self.rowNum)
        # 获取总列数
        self.colNum = self.table.ncols
        # print(self.colNum)
    def dict_data(self):    
        if self.rowNum <= 1:
            print("总行数小于1")
        else:
            r = []
            j=1
            for i in range(self.rowNum-1):
                s = {
    
    }
                # 从第二行取对应values值
                values = self.table.row_values(j)
                # print(values)
                for x in range(self.colNum):
                    s[self.keys[x]] = str(values[x])
                r.append(s)
                j+=1
            return r

    def list_data(self):
        if self.rowNum <= 1:
            print("总行数小于1")
        else:
            r = []
            j=0
            for i in range(self.rowNum-1):
                s = []
                # 从第一行取对应values值
                values = self.table.row_values(j)
                # print(values)
                k = 0
                for x in range(self.colNum):
                    s.append(str(values[x]))

                r.append(s)
                j+=1
            return r

if __name__ == "__main__":
    filepath = r"C:\XXX\regRepassword.xls"
    #sheetName = "Sheet1"
    data = ExcelUtil(filepath, "regRepassword").dict_data()
    print(data)
  • 如果你使用字典,那么自动化用例数据如下:

在这里插入图片描述

  • 如果你使用列表,则不用写第一行就行

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/yang_yang_heng/article/details/108717755
今日推荐