自动化测试框架2:框架搭建

这篇博客介绍了如何使用unittest2创建自动化测试框架,包括setUpClass和tearDownClass的使用,以及如何通过继承父类BaseTestCase实现公共属性的复用。此外,还展示了如何进行数据驱动测试,通过读取CSV文件批量注册用户,并使用ddt模块确保每个测试用例独立执行,即使有失败也不会影响后续测试。
摘要由CSDN通过智能技术生成

自动化测试框架文件管理思路

在这里插入图片描述
在这里插入图片描述

setUpClass、tearDownClass要调用同一个属性,需要加cls.
若其他方法func也要调用该属性,则加self.

class LoginTest(unittest2.TestCase):
    def test_login(self):
        self.driver.get('')    # 调用公共属性

    @classmethod
    def setUpClass(cls):
        cls.driver = webdriver.Chrome('C:\Program Files\Google\Chrome\Application\chromedriver')  # 创建公共属性

    @classmethod
    def tearDownClass(cls):
        cls.driver.quit()  # 调用公共属性

登录方法

  • 代码
import time
import unittest2
from selenium import webdriver


class LoginTest(unittest2.TestCase):
    def test_login(self):
        self.driver.get('http://localhost/index.php?m=user&c=public&a=login')    # 调用公共属性
        self.driver.find_element_by_id('username').send_keys('zhengzhouxiao')
        self.driver.find_element_by_id('password').send_keys('123123123')
        self.driver.find_element_by_css_selector('.login_btn.fl').click()

    @classmethod
    def setUpClass(cls):
        # cls.driver = webdriver.Chrome('C:\Program Files\Google\Chrome\Application\chromedriver')
        cls.driver = webdriver.Chrome()  # 创建公共属性
        cls.driver.maximize_window()
        cls.driver.implicitly_wait(5)

    @classmethod
    def tearDownClass(cls):
        time.sleep(10)
        cls.driver.quit()  # 调用公共属性


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

BaseTestCase

创建一个父类,实现setUpClass和tearDownClass方法,以后的测试用例继承这个父类,继承父类,就继承了父类的所有方法,不需要重复写方法

在这里插入图片描述

  • 代码
import unittest2
from selenium import webdriver
import time

class BaseTestCase(unittest2.TestCase):
    @classmethod
    def setUpClass(cls):
        cls.driver = webdriver.Chrome()
        cls.driver.maximize_window()
        cls.driver.implicitly_wait(5)

    @classmethod
    def tearDownClass(cls):
        time.sleep(10)
        cls.driver.quit()

在这里插入图片描述

  • 注册方法 代码
import unittest2
from test_case.BestTestCase import BaseTestCase

class RegisterTest(BaseTestCase):
    def test_register(self):
        self.driver.get('http://localhost/index.php?m=user&c=public&a=reg')
        self.driver.find_element_by_name('username').send_keys('new_user')
        self.driver.find_element_by_name('password').send_keys('password')
        self.driver.find_element_by_name('userpassword2').send_keys('password')
        self.driver.find_element_by_name('mobile_phone').send_keys('13412312311')
        self.driver.find_element_by_name('email').send_keys("123123123@qq.com")
        self.driver.find_element_by_class_name('reg_btn').click()

数据驱动测试

如批量注册10个用户

步骤:

1、准备一个excel表格,保存好10个用户信息

2、编写代码读取excel表中的内容

  • 步骤&代码
# 1、导入代码库
import csv
# 2、指定csv文件所在路径
    # 当路径中存在反斜线时,需要在字符串前面加一个字母r,用来表示不再把反斜线/看成转译字符
path=r'C:\Users\admin\PycharmProjects\study1.0\test_data\esigter_test_data.csv'
# 3、打开csv文件
with open(path) as tile
# 4、读取csv文件中的内容
    table = csv.reader(file)
# 5、打印csv文件的内容
    for row in table:
        print(row)
  • 封装成一个方法并返回值被调用
import csv

def reader(filename):
    path = '../test_data/'+filename  
    #..表示当前路径的上层路径,将反斜杆\换成斜杆/则不用r放置前面
    file = open(path)
    table = csv.reader(file)
    return table

在这里插入图片描述

  • 去掉表格第1行字段名方法
import csv

def reader(filename):
    list = []
    # path = '../test_data/'+filename
    path = r"C:\Users\admin\PycharmProjects\study1.0\test_data\\" + filename
    with open(path) as file:
        table = csv.reader(file)
        i = 0
        for row in table:
            if i == 0:
                pass
            else:
                list.append(row)
            i = i+1
    return list

    

3、把读取到的内容分别传入测试用例中,循环执行10次

    - 运行方法代码

from func.csvfileManager2 import reader
from test_case.BaseTestCase import BaseTestCase

class Register2Test(BaseTestCase):
    def test_register(self):
        table = reader('resigter_test_data.csv')
        for row in table:
            self.driver.get('http://localhost/index.php?m=user&c=public&a=reg')
            self.driver.find_element_by_name('username').send_keys(row[0])
            self.driver.find_element_by_name('password').send_keys(row[1])
            self.driver.find_element_by_name('userpassword2').send_keys(row[2])
            self.driver.find_element_by_name('mobile_phone').send_keys(row[3])
            self.driver.find_element_by_name('email').send_keys(row[4])
            self.driver.find_element_by_class_name('reg_btn').click()

        - 实际运行中遇到的问题

在这里插入图片描述

实际运行时老提示找不到该文件 ,将func.csvfileManager2中的path相对路径换成绝对路径(注意转义符转化)成功

  • 代码
import csv

def reader(filename):
    # path = '../test_data/'+filename  # 不成功
    # path = "C:\\Users\\admin\\PycharmProjects\\study1.0\\test_data\\" + filename  
    # 成功
    path = r"C:\Users\admin\PycharmProjects\study1.0\test_data\\" + filename   
    # 成功,注意最后的\要写成\\,否则后面的变量不准确 

    print(path)
    file = open(path)
    table = csv.reader(file)
    return table

reader('resigter_test_data.csv')

    问题:用for循环,当其中任何一条测试用例执行失败,后续测试数据将不被执行

    解决:
    1、导入代码库 ddt (data driver test),即数据驱动测试
    2、调用读取csv文件的方法
    3、把每一行数据看成一个单独的测试用例来执行
     在类的上面加装饰器 @ddt.ddt 表示当前类是一个数据驱动测试的类;
     在方法上面加装饰器 @ddt.data() 用来指定测试数据源,要求数据源的格式不能是数组或是列表,得是多个参数:
     列表前面加*表示把列表内的数据转化为对应数量的变量
在这里插入图片描述

  • 参考代码
import ddt
import unittest2
from func.csvfileManager2 import reader
from test_case.BaseTestCase import BaseTestCase

@ddt.ddt
class Register3Test(BaseTestCase):
    table = reader('resigter_test_data.csv')

    # table是一个列表,前面加*表示把列表内的数据转化为对应数量的变量
    @ddt.data(*table)
    def test_register(self,row):
        self.driver.get('http://localhost/index.php?m=user&c=public&a=reg')
        self.driver.find_element_by_name('username').send_keys(row[0])
        self.driver.find_element_by_name('password').send_keys(row[1])
        self.driver.find_element_by_name('userpassword2').send_keys(row[2])
        self.driver.find_element_by_name('mobile_phone').send_keys(row[3])
        self.driver.find_element_by_name('email').send_keys(row[4])
        self.driver.find_element_by_class_name('reg_btn').click()

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

    

    批量执行测试用例

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值