2024Python自动化测试5种模型(建议收藏)

1、前言

在自动化测试中,我们往往将自动化脚本都归纳属于哪种框架模型,比如关键字驱动模型等。

本篇将列举实际自动化测试中,Python 自动化测试的五种模型:线性模型、模块化驱动模型、数据驱动模型、关键字驱动模型、行为驱动模型。

2、线性模型

通过录制或编写脚本,一个脚本完成一个场景(一组完整功能操作),通过对脚本的回放进行自动化测试。

脚本代码:

python 复制代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import time
from selenium import webdriver

driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(30)

driver.get('https://www.baidu.com/')
time.sleep(1)
driver.find_element_by_id('kw').send_keys('自动化测试')
time.sleep(1)
driver.find_element_by_id('su').click()
time.sleep(1)
driver.quit()

3、模块化驱动模型

将脚本中重复可复用的部分拿出来写成一个公共的模块,需要的时候就调用它,这样可以大幅提高测试人员编写脚本的效率。

框架目录:

1、config 存放配置文件。

例如 base_data.json 文件,存放测试地址。

{
  "url": "https://www.baidu.com/"
}

2、data 存放测试数据。

3、drivers 存放浏览器驱动文件。

4、report 存放执行完成后的测试报告。

5、test 存放测试用例。

(1)case 测试用例步骤。

例如 testSearch.py

python 复制代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import time
import os
import unittest
from selenium import webdriver
from AutomatedTestModel.ModularDriverModel.utils.ReadConfig import ReadConfig
from AutomatedTestModel.ModularDriverModel.test.pages.searchPage import SearchPage

class TestSearch(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Chrome()
        self.driver.maximize_window()
        self.driver.implicitly_wait(30)

    def tearDown(self):
        self.driver.quit()

    def get_url(self):
        current_path = os.path.abspath((os.path.dirname(__file__)))
        data = ReadConfig().read_json(current_path + "/../../config/base_data.json")
        return data['url']

    def test_search(self):
        url = self.get_url()
        self.driver.get(url)
        time.sleep(1)
        search = SearchPage(self.driver)
        search.search('自动化测试')

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

(2)common 存放公共的方法等。

(3)pages 存放页面元素与页面操作。

例如 searchPage.py

python 复制代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import time

class SearchPage:
    def __init__(self, driver):
        self.driver = driver

    def search_element(self):
        self.kw = self.driver.find_element_by_id('kw')
        self.su = self.driver.find_element_by_id('su')

    def search(self, data):
        self.search_element()
        self.kw.send_keys(data)
        time.sleep(1)
        self.su.click()

(4)runner 存放运行脚本。

例如 main.py

python 复制代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import time
import unittest
from AutomatedTestModel.ModularDriverModel.utils.HwTestReport import HTMLTestReport

class Main:
    def get_all_case(self):
        current_path = os.path.abspath(os.path.dirname(__file__))
        case_path = current_path + '/../case/'
        discover = unittest.defaultTestLoader.discover(case_path, pattern="test*.py")
        print(discover)
        return discover

    def set_report(self, all_case, report_path=None):
        if report_path is None:
            current_path = os.path.abspath(os.path.dirname(__file__))
            report_path = current_path + '/../../report/'
        else:
            report_path = report_path

        # 获取当前时间
        now = time.strftime('%Y{y}%m{m}%d{d}%H{h}%M{M}%S{s}').format(y="年", m="月", d="日", h="时", M="分", s="秒")
        # 标题
        title = u"搜索测试"
        # 设置报告存放路径和命名
        report_abspath = os.path.join(report_path, title + now + ".html")
        # 测试报告写入
        with open(report_abspath, 'wb') as report:
            runner = HTMLTestReport(stream=report,
                                    verbosity=2,
                                    images=True,
                                    title=title,
                                    tester='Meng')
            runner.run(all_case)

    def run_case(self, report_path=None):
        all_case = self.get_all_case()
        self.set_report(all_case, report_path)

if __name__ == '__main__':
    Main().run_case()

6、utils 存放公共方法。

例如导出报告样式、读取配置文件等。

7、run.py 运行脚本。

python 复制代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 软件测试

from AutomatedTestModel.ModularDriverModel.test.runner.main import Main

if __name__ == '__main__':
    Main().run_case()

运行后的测试报告。

4、数据驱动模型

该模型会根据数据的变化而引起测试结果的改变,这显然是一个非常高级的概念和想法。简单地说,该模型是一种数据的参数化呈现,即通过输入不同的参数来驱动程序执行,输出不同的测试结果。

框架目录:

1、case 存放测试用例步骤。

2、common 存放公共的方法等。

如读取 Excel 方法、生成报告等样式。

3、data 存放测试数据与预期结果。

4、report 存放执行完成后的测试报告。

打开报告效果。

5、RunMain.py 运行脚本。

python 复制代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os, time, unittest
from AutomatedTestModel.DataDrivenModeling.common.HwTestReport import HTMLTestReport

class RunMain:
    def get_all_case(self):
        case_path = os.getcwd()
        discover = unittest.defaultTestLoader.discover(case_path,
                                                       pattern="Test*.py")
        print(discover)
        return discover

    def set_report(self, all_case, report_path=None):
        if report_path is None:
            current_path = os.path.abspath(os.path.dirname(__file__))
            report_path = current_path + '/report/'
        else:
            report_path = report_path

        # 获取当前时间
        now = time.strftime('%Y{y}%m{m}%d{d}%H{h}%M{M}%S{s}').format(y="年", m="月", d="日", h="时", M="分", s="秒")
        # 标题
        title = u"搜索测试"
        # 设置报告存放路径和命名
        report_abspath = os.path.join(report_path, title + now + ".html")
        # 测试报告写入
        with open(report_abspath, 'wb') as report:
            runner = HTMLTestReport(stream=report,
                                    verbosity=2,
                                    images=True,
                                    title=title,
                                    tester='Meng')
            runner.run(all_case)

    def run_case(self, report_path=None):
        all_case = self.get_all_case()
        self.set_report(all_case, report_path)

if __name__ == "__main__":
    RunMain().run_case()

5、关键字驱动模型

这是一种通过关键字的改变而引起测试结果改变的功能自动化测试模型。QTP(UFT)、Robot Framework 等都是以关键字驱动为主的自动化测试工具,这类工具典型的特征就是具备一套易用的可视化界面,测试人员需要做的就是将测试脚本按照"填表格"的方式填入,并考虑三个问题就可以了:我要做什么?对谁做?怎么做?

框架目录:

1、action 主要存放动作事件、元素操作。

(1)Action.py

python 复制代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from AutomatedTestModel.KeywordDrivenModel.common.ExcelUtil import ExcelUtil
from AutomatedTestModel.KeywordDrivenModel.action.ElementOperation import ElementOperation

class Action:
    def __init__(self):
        self.element = ElementOperation()

    def set_value(self, element, action, parameter=None):
        if element == "browser":
            return self.element.browser_operate(action, parameter)
        elif element == "time":
            return self.element.time_operate(action, parameter)
        elif element is None or element == "":
            return
        else: # 如果不是其他的关键字,则默认为定位的元素
            return self.element.element_operate(element, action, parameter)

    def case_operate(self, excel, sheet):
        all_case = ExcelUtil(excel_path=excel, sheet_name=sheet).get_case()
        for case in all_case:
            self.set_value(case[0], case[1], case[2])

if __name__ == '__main__':
    excel = '../case/casedata.xlsx'
    Action().case_operate(excel=excel, sheet='搜索')

(2)ElementOperation.py

2、case 存放测试用例步骤。

3、common 存放公共的方法等。

如读取 Excel 方法等。

4、RunMain.py 运行脚本。

python 复制代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from AutomatedTestModel.KeywordDrivenModel.action.Action import Action

if __name__ == '__main__':
    excel = 'case/casedata.xlsx'
    a = Action().case_operate(excel=excel, sheet='搜索')

6、行为驱动模型

行为驱动开发(Behave Driven Development,简称BDD),即从用户的需求出发强调系统行为。通过将BDD借鉴到自动化测试中,便产生了行为驱动测试模型,这种模型通过使用自然描述语言确定自动化测试脚本,其优点是可使用自然语言编写测试用例。

框架目录:

1、features 存放用例。

(1)steps 存放步骤

python 复制代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import time
from behave import *

@When('打开访问的网页 "{url}"')
def step_open(context, url):
    context.driver.get(url)
    time.sleep(5)

@Then('进入百度网站成功')
def step_assert_open(context):
    title = context.driver.title
    assert title == "百度一下,你就知道"

@When('输入 "{searchdata}"')
def step_search(context, searchdata):
    searchdata_element = context.driver.find_element_by_id('kw')
    searchdata_element.send_keys(searchdata)
    time.sleep(1)
    submit_btn = context.driver.find_element_by_id('su')
    submit_btn.click()

@Then('获取标题')
def step_assert_search(context):
    success_message = context.driver.title
    assert success_message == "自动化测试_百度搜索"

(2)environment.py 存放变量

(3)search.feature 存放行为

2、report、result 存放报告

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

相关推荐
诸葛悠闲11 分钟前
《操作系统 - 清华大学》4 -5:非连续内存分配:页表一反向页表
linux·程序人生
互联网杂货铺6 小时前
接口测试和单元测试
自动化测试·软件测试·测试工具·职场和发展·单元测试·测试用例·接口测试
豆子熊.10 小时前
外包干了3年,技术退步明显...
软件测试·selenium·测试工具·面试·职场和发展
数懒女士13 小时前
饿汉模式和懒汉模式(面试)
面试·职场和发展
无限大.13 小时前
力扣题解 3233. 统计不是特殊数字的数字数量(中等)
算法·leetcode·职场和发展
蹉跎x17 小时前
力扣104. 二叉树的最大深度
算法·leetcode·职场和发展
hn小菜鸡20 小时前
LeetCode 144.二叉树的前序遍历
算法·leetcode·职场和发展
Mr.kanglong21 小时前
【LeetCode热题100】队列+宽搜
算法·leetcode·职场和发展
小码哥说测试1 天前
Selenium + 数据驱动测试:从入门到实战!
自动化测试·软件测试·selenium·测试工具·职场和发展·接口测试·postman
好好学习O(∩_∩)O1 天前
11-23刷题记录
算法·leetcode·职场和发展