selenium自动化测试——unittest框架

news2025/4/6 18:56:53

文章目录

  • unittest
    • unittest 框架
    • 组成细节
  • unittest测试示例
  • 用例的执行顺序
    • 忽略测试用例的执行
  • unittest断言
  • HTML报告生成
    • 生成HTML报告步骤
  • 异常捕捉与错误截图
  • 数据驱动

unittest

unittest 是python 的单元测试框架, 在python 的官方文档中,对unittest有详细的介绍,可以到https://www.python.org/doc/ 去了解。

unittest 单元测试提供了创建测试用例,测试套件以及批量执行的方案, unittest 在安装pyhton 以后就直接自带了,直接import unittest 就可以使用。

unittest 框架

在这里插入图片描述

test fixture:初始化和清理测试环境,比如创建临时的数据库,文件和目录等,其中 ==setUp() 和 setDown()==是最常用的方法
test case:单元测试用例,TestCase 是编写单元测试用例最常用的类

test suite:单元测试用例的集合,TestSuite 是最常用的类
test runner:执行单元测试
test report:生成测试报告

组成细节

1.测试固件(框架里面的固定的方法)
setup方法,测试环境和数据的准备工作
teardown() : 环境的清理工作
2.测试用例
一个用例是一个方法 def名字以test_开头
所有测试类中自定义方法,都必须以test_开头
运行脚本的时候默认自动运行test_ 开头的方法。
3.测试套件
把测试用例组织到一起进行一个整体的测试

# 定义测试套件
testunit = unittest.TestSuite()
# 向测试套件添加测试用例
testunit.addTest(TestBaiDu("test_search_set"))
testunit.addTest(TestBaiDu("test_baidu_search"))

# 把一个类里面所有测试用例添加进去 unittest.makeSuite(testbaidu1.Baidu1)
# (脚本名.类名)
testunit.addTest(unittest.makeSuite(test08.TestBaiDu))

# 把一个类中所有测试方法创建测试套件返回
suite = unittest.TestSuite()
suite1 = unittest.TestLoader().loadTestsFromTestCase(testbaidu1.Baidu1) 
suite2 = unittest.TestLoader().loadTestsFromTestCase(testbaidu2.Baidu2) 
suite = unittest.TestSuite([suite1, suite2])

# 把一个文件夹下所有测试脚本的测试用例执行一遍
discover=unittest.defaultTestLoader.discover('../test',pattern='test*.py',top_level_dir=None)

makeSuite()和TestLoader()的应用

在unittest 框架中提供了makeSuite() 的方法,makeSuite可以实现把测试用例类内所有的测试case组成测试套件TestSuite ,unittest 调用makeSuite的时候,只需要把测试类名称传入即可。
TestLoader 用于创建类和模块的测试套件,一般的情况下TestLoader().loadTestsFromTestCase(TestClass)来加载测试类。

discover()

discover 是通过递归的方式到其子目录中从指定的目录开始, 找到所有测试模块并返回一个包含它们对象的TestSuite ,然后进行加载与模式匹配唯一的测试文件.
在这里插入图片描述

unittest测试示例

示例:

1.在百度首页输入关键字搜索
2.百度首页搜索设置
两个测试用例相继执行,并形成测试报告

from selenium import webdriver
from time import sleep
import unittest
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
# 导入运行结果报告生成模块
from HTMLTestRunner import HTMLTestRunner
# 定义测试类,继承unittest.TestCase
class TestBaiDu(unittest.TestCase):
    #定义测试类方法
    #所有测试类中自定义方法,都必须以test_开头
    def test_baidu_search(self):
        """
        在百度首页输入关键字搜索
        :return:
        """
        wd=webdriver.Chrome()
        wd.get("http://wwww.baidu.com")
        sleep(3)
        wd.find_element(By.ID, 'kw').send_keys("刘耀文")
        sleep(2)
        wd.find_element(By.ID, 'su').click()
        sleep(2)
        # 设置用例执行的预期结果 判断是否在网页标题中
        exp = "刘耀文" in wd.title
        # 利用断言方法
        self.assertTrue(exp, "标题中没有你想要的关键字")
        wd.quit()
        pass
    def test_search_set(self):
        """
        百度首页搜索设置
        :return:
        """

        wd = webdriver.Chrome()
        wd.get("http://wwww.baidu.com")
        sleep(3)
        aset = wd.find_element(By.ID, 's-usersetting-top')
        ActionChains(wd).move_to_element(aset).perform()
        sleep(2)
        wd.find_element(By.LINK_TEXT, '搜索设置').click()
        sleep(2)
        wd.find_element(By.LINK_TEXT, '保存设置').click()
        # 处理弹窗
        sleep(2)
        wd.switch_to.alert.accept()
        sleep(2)
        print(wd.current_url)
        # 判断首页网址
        self.assertEqual("https://www.baidu.com/", wd.current_url, "返回首页有误")
        wd.quit()
        pass
# 定义测试套件
testunit = unittest.TestSuite()
# 向测试套件添加测试用例
testunit.addTest(TestBaiDu("test_search_set"))
testunit.addTest(TestBaiDu("test_baidu_search"))
# 创建测试报告 HTML格式的测试执行报告
fp = open("result.html", "wb")
# 创建执行对象
runner = HTMLTestRunner(stream=fp, title="百度测试搜素", description="用例执行情况:")
runner.run(testunit)
fp.close()

测试报告:
在这里插入图片描述

用例的执行顺序

unittest 框架默认加载测试用例的顺序是根据ASCII 码的顺序,数字与字母的顺序为: 0~ 9,A~ Z,a~z 。
所以, TestAdd 类会优先于TestBdd 类被发现, test_aaa() 方法会优先于test_ccc() 被执行

addTest()方法按照增加顺序来执行

忽略测试用例的执行

对于不想运行的测试用例,方法上加

@unittest.skip(u'The function was canceled, neglects to perform thecase')

如下:
在这里插入图片描述

unittest断言

自动化的测试中, 对于每个单独的case来说,一个case的执行结果中, 必然会有期望结果与实际结果, 来判断该case是通过还是失败, 在unittest 的库中提供了大量的实用方法来检查预期值与实际值, 来验证case的结果。

断言:判断实际结果和预期结果是否相符合。

unittest 的单元测试库提供了标准的xUnit 断言方法:

断言方法断言描述
assertEqual(arg1, arg2, msg=None)验证arg1=arg2,不等则fail
assertNotEqual(arg1, arg2, msg=None)验证arg1 != arg2, 相等则fail
assertTrue(expr, msg=None)验证expr是true,如果为false,则fail
assertFalse(expr,msg=None)验证expr是false,如果为true,则fail
assertIs(arg1, arg2, msg=None)验证arg1、arg2是同一个对象,不是则fail
assertIsNot(arg1, arg2, msg=None)验证arg1、arg2不是同一个对象,是则fail
assertIsNone(expr, msg=None)验证expr是None,不是则fail
assertIsNotNone(expr, msg=None)验证expr是不是None,不是则fail
assertIn(arg1, arg2, msg=None)验证arg1是arg2的子串,不是则fail
assertNotIn(arg1, arg2, msg=None)验证arg1不是arg2的子串,是则fail
assertIsInstance(obj, cls, msg=None)验证obj是cls的实例,不是则fail
assertNotIsInstance(obj, cls, msg=None)验证obj不是cls的实例,是则fail

HTML报告生成

本执行完毕之后,还需要看到HTML报告,下面我们就通过HTMLTestRunner.py 来生成测试报告。
HTMLTestRunner支持python2.7。python3可以参见http://blog.51cto.com/hzqldjb/1590802来进行修改。
HTMLTestRunner.py 文件,下载地址: http://tungwaiyip.info/software/HTMLTestRunner.html
下载后将其放在testcase目录中去或者放入…\Python38\Lib 目录下(windows)
如需要该python 文件的得话,可评论或者私信

生成HTML报告步骤

在这里插入图片描述
1.创建一个存放HTML报告得文件夹
2.解决重复命名的问题(用当前时间来命名)
3.报告的输出

异常捕捉与错误截图

错误截图API:get_screenshot_as_file()

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
from selenium.webdriver.common.by import By
import unittest, time, re
import os


class Baidu1(unittest.TestCase):
    # test fixture,初始化环境
    def setUp(self):
        self.driver = webdriver.Chrome()
        self.driver.implicitly_wait(30)
        self.base_url = "http://www.baidu.com/"
        self.verificationErrors = []
        self.accept_next_alert = True


    # 测试用例,必须以test开头
    def test_hao(self):
        driver = self.driver
        driver.get(self.base_url + "/")
        driver.find_element(By.LINK_TEXT, "hao123").click()
        time.sleep(2)
        try:
            self.assertEqual(u'hao_上网从这里开始', driver.title)
        except:
            self.savescreenshot(driver, 'hao.png')

    # 判断element是否存在,可删除
    def is_element_present(self, how, what):
        try:
            self.driver.find_element(by=how, value=what)
        except NoSuchElementException as e:
            return False
        return True


    # 判断alert是否存在,可删除
    def is_alert_present(self):
        try:
            self.driver.switch_to_alert()
        except NoAlertPresentException as e:
            return False
        return True


    # 关闭alert,可删除
    def close_alert_and_get_its_text(self):
        try:
            alert = self.driver.switch_to_alert()
            alert_text = alert.text
            if self.accept_next_alert:
                alert.accept()
            else:
                alert.dismiss()
                return alert_text
        finally: self.accept_next_alert = True


    # test fixture,清除环境
    def tearDown(self):
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)


    def savescreenshot(self, driver, file_name):
        if not os.path.exists('./image'):
            os.makedirs('./image')
        now = time.strftime("%Y%m%d-%H%M%S", time.localtime(time.time()))
        # 截图保存
        driver.get_screenshot_as_file('./image/' + now + '-' + file_name)
        time.sleep(1)
if __name__ == "__main__":
    # 执行用例
    unittest.main()

数据驱动

数据驱动:用测试数据驱动测试用例
1.安装ddt

cmd中使用如下命令:pip install ddt

2.导包

from ddt import ddt, data, unpack, file_data

3.数据驱动的方式

@data(value):一次性传一个参数
@data(value1,value2,…):一次性传递多个参数,需要用**@unpack** 映射
@file_data(“json 文件”) :
@data(“解析数据的方法(TXT/CSV文件)”)

4.注意
txt/csv文档中开头要有data,以及文件的格式(在保存文件时更改或在代码中读取时转换)
在这里插入图片描述
json 文件:

[
 "Hello",
 "Goodbye"
]
# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
from selenium.webdriver.common.by import By
import unittest, time, re
import os, sys, csv
from ddt import ddt, data, unpack, file_data


def getCsv(file_name):
    rows = []
    path = sys.path[0]
    print(path)
    with open(path + '/data/' + file_name, 'rt') as f:
        readers = csv.reader(f, delimiter=',', quotechar='|')
        next(readers, None)
        for row in readers:
            temprows = []
            for i in row:
                temprows.append(i)
            rows.append(temprows)
        return rows


# 引入ddt
@ddt
class ddttest(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Chrome()
        self.driver.implicitly_wait(30)
        self.base_url = "http://www.baidu.com"
        self.verificationErrors = []
        self.accept_next_alert = True

    # 测试用例,必须以test开头
    # 增加ddt数据
    # @data('selenium', u'测试中文', '9999999999')
    # @data(2,3,4)
    # 单变更时不使用unpack
    # @data([3, 2], [4, 3], [5, 3])
    # @data(*getCsv('test_baidu_data.txt'))
    # 使用file_data需要在cmd窗口下运行,否则找不到文件
    # @file_data('test_data_list.json')
    @data(*getCsv('test_baidu_data.csv'))
    @unpack
    def test_hao(self, value, expected_value):
        driver = self.driver
        driver.get(self.base_url + "/")
        driver.find_element(By.ID, "kw").clear()
        driver.find_element(By.ID, "kw").send_keys(value)
        driver.find_element(By.ID, "su").click()
        time.sleep(2)
        self.assertEqual(expected_value, driver.title)
        print(expected_value)
        print(driver.title)

    # 判断element是否存在,可删除
    def is_element_present(self, how, what):
        try:
            self.driver.find_element(by=how, value=what)
        except NoSuchElementException as e:
            return False
        return True
        # 判断alert是否存在,可删除

    def is_alert_present(self):
        try:
            self.driver.switch_to.alert()
        except NoAlertPresentException as e:
            return False
        return True

    def close_alert_and_get_its_text(self):
        try:
            alert = self.driver.switch_to.alert()
            alert_text = alert.text
            if self.accept_next_alert:
                alert.accept()
            else:
                alert.dismiss()
            return alert_text
        finally:
            self.accept_next_alert = True
        # test fixture,清除环境

    def tearDown(self):
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)

    def savescreenshot(self, driver, file_name):
        if not os.path.exists('./image'):
            os.makedirs('./image')
        now = time.strftime("%Y%m%d-%H%M%S", time.localtime(time.time()))
        # 截图保存
        driver.get_screenshot_as_file('./image/' + now + '-' + file_name)
        time.sleep(1)


if __name__ == "__main__":
    # 执行用例
    unittest.main()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/101559.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学会JVM,从这篇开始

目录 一、了解 JVM 二、JVM内存划分 三、类加载 1. 类加载是干啥的? 什么是类对象 ? 2. 类加载的大致过程 3. 什么是 双亲委派模型(重点) ? 四、GC 1. GC回收的是哪里的内存 2. 回收如何判断某个对象是否是垃圾? ① 引用计数(Python PHP采用) ② 可达性分析(JVM采用) 3. …

【计算机考研408】2023考研408大题预测总结

数据结构 链表相关算法题 反转链表1 题源1:反转链表1 比较简单,可以作为思想记忆,不太会这么直接考察 408可能考察链表的实现, ListNode* reverseList(ListNode* head) {if(head NULL) return NULL;//头插法ListNode * p …

计算机毕设Python+Vue学生健康管理系统(程序+LW+部署)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

jsp+ssm计算机毕业设计二手车交易系统【附源码】

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: JSPSSM mybatis Maven等等组成,B/S模式 Mave…

(八) mysql主从以及Redis集群

mysql主从以及Redis集群一、Mysq主从复制安装1、新建主服务器容器实例33072、进入/mydata/mysql-master/conf目录下新建my.cnf3、进入mysql-master容器4、master容器实例内创建数据同步用户5、新建从服务器容器实例33086、创建从机的配置文件7、在主数据库中查看主从同步状态8、…

Linux——shell及其基本命令

一、认识shell Shell是一个命令语言解释器。登陆Linux后,所有的命令都被shell解释,它支持函数、变量、数组、程序设计结构等。分为Bourne Shell和 C Shell,红帽默认Bash,是B Shell的扩展,完全兼容。 1.启…

python中使用马尔可夫决策过程(MDP)动态编程来解决最短路径强化学习问题

在强化学习中,我们有兴趣确定一种最大化获取奖励的策略。最近我们被客户要求撰写关于MDP的研究报告,包括一些图形和统计输出。假设环境是马尔可夫决策过程 (MDP)的理想模型 ,我们可以应用动态编程方法来解决强化学习…

【C++】STL——stack和queue的介绍与使用及模拟实现

stack和queue的介绍与使用及模拟实现 文章目录stack和queue的介绍与使用及模拟实现1.stack的介绍与使用1.1.stack的介绍1.2.stack的使用1.3.stack的模拟实现2.queue的介绍和使用2.1.queue的介绍2.2.queue的使用2.3.queue的模拟实现3. 容器适配器3.1.STL标准库中stack和queue的底…

分享15个全球顶尖的AIGC图片生成平台

人工智能正在改变许多行业的格局,而其中改变最直观和影响最大的就是AIGC领域的图像创作。 发展至今已经有很多AI图像生成平台,他们的共同特点就是使用人工智能将文本转换为图像,这是一次革命性的突破,也就是说通过这些AI工具可以…

springboot多数据源---3多数据源组件

一、dynamic-datasource多数源组件 两三个数据源、事务场景比较少 基于 SpringBoot 的多数据源组件,功能强悍,支持 Seata 分布式事务。 支持 数据源分组 ,适用于多种场景 纯粹多库 读写分离 一主多从 混合模式。 支持数据库敏感配置信息 加密…

卡尔曼滤波

文章目录References卡尔曼滤波的作用世界中充满着不确定性在工程中整体感受状态空间方程结合例子理解公式公式6-1说明公式6-2说明参数H的意义总结怎么融合?从简单的例子入手-测量一枚硬币的直径融合实例卡尔曼公式详细推导协方差矩阵卡尔曼增益的推导详细推导误差协…

基于规则的分类(顺序覆盖算法)及最近邻分类器(KNN算法)

顺序覆盖算法的步骤 顺序覆盖算法的目标是提取一个分类规则,该规则覆盖训练集中大量正例,没有或仅覆盖少量反例。 整个过程包含以下四个步骤: 规则增长规则评估停止准则规则剪枝 顺序覆盖算法的第一步——规则增长 一般到特殊&#xff08…

高压功率放大器基于液晶生物光电传感器中的应用

实验名称:基于液晶的高通量蛋白质光电生物传感器 研究方向:生物识别与检测 测试目的: 蛋白质分析是疾病诊断和医学研究中一类重要的方法。本文提出了一种单基底的液晶生物光电传感器,可用于快速检测蛋白质的浓度。实验发现单基底液…

ZigBee案例笔记 -- LED控制与按键检测(输入/输出)

文章目录1.相关寄存器2.按键检测(引脚输入配置)3.LED控制(引脚输出配置)1.相关寄存器 CC2530(ZigBee)的开发也是类似51单片机一样针对寄存器进行配置,因为其内核实质上也是51内核,对…

Sulfo CY5-MAL|磺基-CY5 马来酰亚胺

Sulfo CY5-MAL|磺基-CY5 马来酰亚胺 英文名称:Cyanine5 maleimide Cyanine5 MAL Cy5 maleimide Cy5 MAL CAS:1437872-46-2 外观:深蓝色粉末 分子量:641.24 分子式:C38H45ClN4O3 花菁染料,一种发…

Hive实训任务

文章目录Hive 实训任务Hive 实训任务 熟练掌握如何创建外部表,加载数据,查询等 先创建一个cx_stu02 外部表,external 指定外部表关键字 create external table cx_stu02(name string,gender string,age int ) row format delimited fields…

一文初识大数据Flink框架

文章目录什么是Flinkflink在github上的现状flink发展历史flink能做什么flink 的高并发能力一些计算框架对比图flink发展方向flink生态体系处理无界和有界数据随处部署应用程序运行任何规模的应用程序利用内存性能官方文档地址:https://flink.apache.org/ 什么是Flink &#x…

php宝塔搭建部署实战Piwigo开源相册管理系统源码

大家好啊,我是测评君,欢迎来到web测评。 本期给大家带来一套php开发的Piwigo开源相册管理系统源码,感兴趣的朋友可以自行下载学习。 技术架构 PHP7.2 nginx mysql5.7 JS CSS HTMLcnetos7以上 宝塔面板 文字搭建教程 下载源码&#x…

基于Python + Requests 的Web接口自动化测试框架

之前采用JMeter进行接口测试,每次给带新人进行培训比较麻烦,干脆用Python实现,将代码和用例分离,易于维护。 项目背景 公司的软件采用B/S架构,进行数据存储、分析、管理 工具选择 python开发的速度很快&#xff0c…

【计算机考研408】数据结构代码规范

408-数据结构代码规范 文章目录408-数据结构代码规范序言优化参考文献考前预测线性表-链表单链表静态链表栈、队列、数组栈的顺序存储类型队列树与二叉树二叉树的定义二叉树的层序遍历树的双亲表示法孩子表示法树的孩子兄弟表示法图邻接矩阵存储法邻接表法二分查找/折半查找模板…