python单元测试框架(测试固件、批量执行)

news2024/11/23 23:41:57

python测试框架

在Python语言中应用最广泛的单元测试框架是unittest和pytest,unittest属于标准库,只要安装了Python解释器后就可以直接导入使用了,pytest是第三方的库,需要单独的安装。

1.白盒测试原理

在软件架构的层面来说,测试最核心的步骤就是在软件开发过程中。就软件本身而言,软件的行为或者功能是软件细节实现的产物,这些最终是交付给用户的东⻄。所以在早期执行测试的系统有可能是一个可测试和健壮的系统,它会带来为用户提供的功能往往是让人满意的结果。因此给予这样的⻆度,开始执行测试的最佳方法是来自源代码,也就是软件编写的地方以及开发人员。由于源代码是对开发人员是可⻅的,这样的一个测试过程我们可以称为白盒测试

2.自动化测试用例编写

 

3.unittest实战

   unittest各个组件的介绍

  • testCase测试⽤例:测试类继承unittest模块中的TestCase类后,依据继承的这个类来设置⼀个新的测试⽤例类和测试⽅法。
  • 测试固件:测试固件表示⼀个测试⽤例或者多个测试以及清理⼯作所需要的设置或者准备。初始化合情理
  • testSuite测试套件:测试套件顾名思义就是相关测试⽤例的集合。在unittest中主要通过TestSuite类提供对测试套件的⽀持。
  • testRunner测试运⾏:管理和运⾏测试⽤例的对象。
  • assert测试断⾔:对所测试的对象依据返回的实际结果与期望结果进⾏断⾔校验
  • 测试结果:测试结果类管理着测试结果的输出,测试结果呈现给最终的⽤户来反馈本次测试执⾏的结果信息。

自动化测试用例要素包含:

1、前提条件 setUp()

2、测试步骤

3、结果验证

4、清理 tearDown()

4.unittest测试固件详解:

在unittest中测试固件依据方法可以分为两种执行方式,一种是测试固件只执行一次,另外一种是测试固件每次都执行,下面依据具体的案例来讲解二者

1.测试固件每次均执行

from selenium import webdriver
import unittest
class BaiduTest(unittest.TestCase):
    def setUp(self) -> None:
        self.driver=webdriver.Chrome()
        self.driver.get('http://www.baidu.com')
        self.driver.maximize_window()
        self.driver.implicitly_wait(30)

    def tearDown(self) -> None:
        self.driver.quit()

    def test_baidu_title(self):
        '''百度测试:验证百度首页的title'''
        # assert self.driver.title=='百度一下,你就知道'
        self.assertEqual(self.driver.title,'百度一下,你就知道')

    def test_baidu_url(self):
        '''百度测试:验证百度首页的url'''
        assert self.driver.current_url=='https://www.baidu.com/'

    def test_baidu_video(self):
        '''百度测试:验证点击视频后跳转到视频的页面'''
        nowhandler=self.driver.current_window_handle
        self.driver.find_element_by_link_text('视频').click()
        allhandlers=self.driver.window_handles
        for handler in allhandlers:
            if handler!=nowhandler:
                self.driver.switch_to.window(handler)
                self.assertTrue(self.driver.current_url.startswith('https://haokan.baidu.com/?sfrom=baidu-top'))

    def test_baidu_map(self):
        '''百度测试:验证点击地图后跳转到地图的页面'''
        nowhandler=self.driver.current_window_handle
        self.driver.find_element_by_link_text('地图').click()
        allhandlers=self.driver.window_handles
        for handler in allhandlers:
            if handler!=nowhandler:
                self.driver.switch_to.window(handler)
                self.assertTrue(self.driver.current_url.startswith('https://map.baidu'))

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

执行如上的代码后,它的顺序为:测试固件-->测试用例,测试固件-->测试用例

2.测试固件只执行一次

使用的是类方法,这样测试固件只会执行一次的,⻅案例的代码:

from selenium import webdriver
import unittest

class BaiduTest(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        cls.driver=webdriver.Chrome()
        cls.driver.maximize_window()
        cls.driver.get('http://www.baidu.com')
        cls.driver.implicitly_wait(30)

    @classmethod
    def tearDownClass(cls) -> None:
        cls.driver.quit()

    def test_baidu_title(self):
        '''百度测试:验证百度首页的title'''
        # assert self.driver.title=='百度一下,你就知道'
        self.assertEqual(self.driver.title,'百度一下,你就知道')

    def test_baidu_url(self):
        '''百度测试:验证百度首页的url'''
        assert self.driver.current_url=='https://www.baidu.com/'

    def test_baidu_video(self):
        '''百度测试:验证点击视频后跳转到视频的页面'''
        nowhandler=self.driver.current_window_handle
        self.driver.find_element_by_link_text('视频').click()
        allhandlers=self.driver.window_handles
        for handler in allhandlers:
            if handler!=nowhandler:
                self.driver.switch_to.window(handler)
                self.assertTrue(self.driver.current_url,'https://haokan.baidu.com/?sfrom=baidu-top')
                self.driver.close()
        self.driver.switch_to.window(nowhandler)

    def test_baidu_map(self):
        '''百度测试:验证点击地图后跳转到地图的页面'''
        nowhandler=self.driver.current_window_handle
        self.driver.find_element_by_link_text('地图').click()
        allhandlers=self.driver.window_handles
        for handler in allhandlers:
            if handler!=nowhandler:
                self.driver.switch_to.window(handler)
                self.assertTrue(self.driver.current_url.startswith('https://map.baidu'))
                self.driver.close()
        self.driver.switch_to.window(nowhandler)

        unittest.main(verbosity=2)

5.测试用例执行顺序详解

在unittest中,测试点的执行顺序是依据ascill码来执行的,也就是说根据ASCII码的顺序加载,数字与字母的顺序为:0-9,A-Z,a-z,所以以A开头的测试用例方法会优先执行,以a开头会后执行。也就是根据数字的大小从小到大执行的,切记数字的大小值的是不包含test,值的是test后面的测试点的数字大小,

6.verbosity的详解

在unittest中,执行的时候默认是1,也就是unittest.main(verbosity=1),在verbosity有三个参数,分别是0,1,2,代表的意思具体如下:

0(静默模式):仅仅获取总的测试用例数以及总的结果

1(默认模式)

2(详细模式):测试结果会显示每个测试用例的所有相关信息

7.测试用例注意事项:

            1、在⼀个测试类⾥⾯,每⼀个测试⽅法都是以test开头的,test不能是中间或者尾部,必须是开头,建议test_

    2、每⼀个测试⽤例⽅法都应该有注释信息,这样在测试报告就会显示具体的测试点的检查点

    3、在⾃动化测试中,每个测试⽤例都必须得有断⾔,⽆断⾔的⾃动化测试⽤例是⽆效的

    4、最好⼀个测试⽤例⽅法对应⼀个业务测试点,不要多个业务检查点写⼀个测试⽤例

    5、如果涉及到业务逻辑的处理,最好把业务逻辑的处理⽅法放在断⾔前⾯,这样做的⽬的是不要因为业务逻辑执⾏错误导致断⾔也是失败

    6、测试⽤例名称最好规范,有约束

    7、是否先写⾃动化测试的测试代码,在使⽤⾃动化测试⽅式写,本⼈觉得没必要,毕竟能够做⾃动化测试的都具备了功能测试的基本⽔平,所以没必要把⼀个业务的检查点写多次,浪费时间和⼈⼒成本。

8.测试套件详解

按测试类执行

from selenium import webdriver
import unittest

class BaiduTest(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        cls.driver=webdriver.Chrome()
        cls.driver.maximize_window()
        cls.driver.get('http://www.baidu.com')
        cls.driver.implicitly_wait(30)

    @classmethod
    def tearDownClass(cls) -> None:
        cls.driver.quit()

    def test_baidu_title(self):
        '''百度测试:验证百度首页的title'''
        # assert self.driver.title=='百度一下,你就知道'
        self.assertEqual(self.driver.title,'百度一下,你就知道')

    def test_baidu_url(self):
        '''百度测试:验证百度首页的url'''
        assert self.driver.current_url=='https://www.baidu.com/'

    def test_baidu_video(self):
        '''百度测试:验证点击视频后跳转到视频的页面'''
        nowhandler=self.driver.current_window_handle
        self.driver.find_element_by_link_text('视频').click()
        allhandlers=self.driver.window_handles
        for handler in allhandlers:
            if handler!=nowhandler:
                self.driver.switch_to.window(handler)
                self.assertTrue(self.driver.current_url,'https://haokan.baidu.com/?sfrom=baidu-top')
                self.driver.close()
        self.driver.switch_to.window(nowhandler)

    def test_baidu_map(self):
        '''百度测试:验证点击地图后跳转到地图的页面'''
        nowhandler=self.driver.current_window_handle
        self.driver.find_element_by_link_text('地图').click()
        allhandlers=self.driver.window_handles
        for handler in allhandlers:
            if handler!=nowhandler:
                self.driver.switch_to.window(handler)
                self.assertTrue(self.driver.current_url.startswith('https://map.baidu'))
                self.driver.close()
        self.driver.switch_to.window(nowhandler)

if __name__ == '__main__':
    # #按测试类来进行执行 调用TestLoader()当中的loadTestsFromTestCase的方法
    suite=unnittest.TestLoader().loadTestsFromTestCase(baiduTest)
    unnitest.TextTestRunner().run(suite)

按测试模块执行:

from selenium import webdriver
import unittest

class BaiduTest(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        cls.driver=webdriver.Chrome()
        cls.driver.maximize_window()
        cls.driver.get('http://www.baidu.com')
        cls.driver.implicitly_wait(30)

    @classmethod
    def tearDownClass(cls) -> None:
        cls.driver.quit()

    def test_baidu_title(self):
        '''百度测试:验证百度首页的title'''
        # assert self.driver.title=='百度一下,你就知道'
        self.assertEqual(self.driver.title,'百度一下,你就知道')

    def test_baidu_url(self):
        '''百度测试:验证百度首页的url'''
        assert self.driver.current_url=='https://www.baidu.com/'

    def test_baidu_video(self):
        '''百度测试:验证点击视频后跳转到视频的页面'''
        nowhandler=self.driver.current_window_handle
        self.driver.find_element_by_link_text('视频').click()
        allhandlers=self.driver.window_handles
        for handler in allhandlers:
            if handler!=nowhandler:
                self.driver.switch_to.window(handler)
                self.assertTrue(self.driver.current_url,'https://haokan.baidu.com/?sfrom=baidu-top')
                self.driver.close()
        self.driver.switch_to.window(nowhandler)

    def test_baidu_map(self):
        '''百度测试:验证点击地图后跳转到地图的页面'''
        nowhandler=self.driver.current_window_handle
        self.driver.find_element_by_link_text('地图').click()
        allhandlers=self.driver.window_handles
        for handler in allhandlers:
            if handler!=nowhandler:
                self.driver.switch_to.window(handler)
                self.assertTrue(self.driver.current_url.startswith('https://map.baidu'))
                self.driver.close()
        self.driver.switch_to.window(nowhandler)

if __name__ == '__main__':
    # 按模块来进行执行
    suite = unnittest.TestLoader().loadTestsFromModule('test_baidu_class.py')
    unnitest.TextTestRunner().run(suite)

9.批量执行所有的测试用例

import unittest
import os

def getTests():
    '''加载所有的测试模块'''
    suite=unittest.TestLoader().discover(
        #找到被执行模块的路径
        start_dir=os.path.dirname(__file__),
        #加载路径下所有以test_开头的测试模块的文件
        pattern='test_*.py' #正则表达式
    )
    return suite

def runSuite():
    unittest.TextTestRunner().run(getTests())

runSuite()

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

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

相关文章

【算法篇C++实现】常见排序算法

文章目录 🚀一、选择排序🚀二、冒泡排序🚀三、插入排序🚀四、希尔排序🚀五、堆排序🚀六、归并排序🚀七、快速排序⛳总结: 🚀一、选择排序 算法精炼每趟从待排序的记录中…

MySql存储过程详解

文章目录 存储过程1 介绍 基本语法创建:调用查看删除演示: 变量相关系统变量演示: 用户自定义变量局部变量 if语法参数介绍casewhilerepeatloop游标条件处理程序存储函数 存储过程 1 介绍 存储过程是事先经过编译并存储在数据库中的一段 SQL 语句的集合,调用存储过…

章节3:Burp Suite模块详解及Proxy模块

章节3:Burp Suite模块详解及Proxy模块 3.1 Burp Suite界面布局 参考手册目录全文 https://portswigger.net/burp/documentation/contents 界面总览 旧版对比 菜单栏-Burp 搜索内容配置库用户选项Infiltrator(渗透器)Clickbandit&#xff…

zerotier requesting configuration

Q:zerotir无法获取physical ip A:路由器管理页面开启ipv6

2.函数进阶

2.1函数提升 函数提升与变量提升比较类似,是指函数在声明之前即可被调用。 总结: 1.函数提升能够使函数的声明调用更灵活 2.函数表达式不存在提升的现象 3.函数提升出现在相同作用域当中 2.2函数参数 1.动态参数 arguments 是函数内部内置的伪数组变量&#xff…

Java多线程知识点,看这一篇就够了!(超详细)

目录 一、认识线程(Thread) 1、概念 2、第一个多线程程序 (1)观察线程 3、创建线程 二、Thread 类及常见方法 1、Thread 的常见构造方法 2、Thread 的几个常见属性 3、启动一个线程:start 4、终止一个线程 &…

【JavaEE进阶】SpringBoot 配置文件

文章目录 SpringBoot配置文件1. 配置文件的作用2. 配置文件的格式3. properties 配置文件说明3.1 properties 基本语法3.2 读取配置文件3.3 properties 优缺点分析 4. yml配置文件说明4.1 yml 基本语法4.2 yml 配置读取 5. properties和yml的对比 SpringBoot配置文件 1. 配置文…

C++笔记之Eigen库的使用

C笔记之Eigen库的使用 code review! 文章目录 C笔记之Eigen库的使用0.矩阵构造和矩阵初始化1.声明一个2\*3的float矩阵&#xff1a;Matrix<float, 2, 3> matrix_23;2.初始化Matrix<float, 2, 3> matrix_23;- 使用逗号初始化器&#xff1a;- 使用赋值运算符逐个赋…

JZ38 字符串的排列

题目地址&#xff1a;字符串的排列_牛客题霸_牛客网 题目回顾&#xff1a; 解题思路&#xff1a; 这里用到了全排列和剪枝。 首先我们来说全排列&#xff0c;设置一个vis数组来记录当期元素是否被使用过&#xff0c;然后dfs遍历整个数组&#xff0c;列出所有符合条件的路径就是…

【ts】【cocos creator】excel表格转JSON

需要将表格导出为text格式放到项目resources/text文件夹下 新建场景&#xff0c;挂载到Canvas上运行 表格文件格式&#xff1a; 保存格式选text tableToJson : import CryptoJS require(./FileSaver);const { ccclass, property } cc._decorator;ccclass export default c…

完结,从零开始学python(十八)想成为一名APP逆向工程师,需要掌握那些技术点?

作为从零学python的最后一篇文章&#xff0c;我们来简单的回顾一下内容 1.编程语法 语法编程并发编程 网络编程多线程/多进程/协程 数据库编程 MySQLRedisMongoDB 2.机器学习 3.全栈开发 4.数据分析 NumpypandasMatplotlibHadoopSpark 5.爬虫工程师养成 采集功底自动化…

js合并数组对象(将数组中具有相同属性对象合并到一起,组成一个新的数组)

一、根据数组对象中某一key值&#xff0c;合并相同key值的字段&#xff0c;到同一个数组对象中&#xff0c;组成新的数组 1.原数组&#xff1a; var array [{ id: 1, name: Alice },{ id: 2, name: Bob },{ id: 1, age: 25 },{ id: 3, name: Charlie, age: 30 } ];2.合并后数…

【JVM】Java内存泄露的排查思路?

文章目录 Java内存为什么会泄露&#xff1f;java内存泄露的排查思路 Java内存为什么会泄露&#xff1f; Java内存泄露&#xff08;Memory Leak&#xff09;是指在Java程序中&#xff0c;无用的对象占用了堆内存&#xff0c;但无法被垃圾回收器回收释放&#xff0c;从而导致可用…

Java地图专题课 基本API BMapGLLib 地图找房案例 MongoDB

本课程基于百度地图技术&#xff0c;由基础入门开始到应用实战&#xff0c;适合零基础入门学习。将企业项目中地图相关常见应用场景的落地实战&#xff0c;包括有地图找房、轻骑小程序、金运物流等。同时讲了基于Netty实现高性能的web服务&#xff0c;来处理高并发的问题。还讲…

Vue前端 更具router.js 中的meta的roles实现路由卫士,实现权限判断。

参考了之篇文章 1、我在登陆时获取到登录用户的角色名roles&#xff0c;并存入sessionStorage中&#xff0c;具体是在login页面实现&#xff0c;还是在menu页面实现都可以。在menu页面实现&#xff0c;可以显得登陆快一些。 2、编写router.js&#xff0c;注意&#xff0c;一个…

链表(基础详解、实现、OJ笔试题)

文章目录 &#x1f9da;什么是链表&#xff08;链表概念及分类&#xff09;链表分类单链表和双链表的区别 &#x1f6b4;‍♂️单链表、双向链表的实现单链表的实现双向链表的实现 &#x1f349;链表经典OJ笔试题反转单链表移除链表元素合并两个有序链表链表分割链表的中间结点…

Ajax入门+aixos+HTTP协议

一.Ajax入门 概念:AJAX是浏览器与服务器进行数据通信的技术 axios使用: 引入axios.js使用axios函数:传入配置对象,再用.then回调函数接受结果,并做后续处理 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>01.axios使用…

【软件工程】面向对象方法-RUP

RUP&#xff08;Rational Unified Process&#xff0c;统一软件开发过程&#xff09;。 RUP特点 以用况驱动的&#xff0c;以体系结构为中心的&#xff0c;迭代增量式开发 用况驱动 用况是能够向用户提供有价值结果的系统中的一种功能用况获取的是功能需求 在系统的生存周期中…

机器学习笔记:李宏毅 stable diffusion

1 基本框架 ①&#xff1a;文字变成向量 ②&#xff1a;喂入噪声文字encoder&#xff0c;产生中间产物 ③&#xff1a;decoder 还原图片 2 text encoder 这张图越往右下表示效果越好&#xff0c;可以看到text encoder尺寸越大&#xff0c;对后续生成图片的增益越多 3 评价图…

【linux基础操作】如何一键下载 各个版本的python库文件

把需要下载的库名字&版本号&#xff0c;存在.txt文件中 2. 输入命令执行&#xff0c;下载 pip install -r your_file_name该命令的作用是从指定的文本文件中安装 Python 依赖库。 在这个命令中&#xff0c;-r 参数表示从一个文本文件&#xff08;通常以 .txt 结尾&#xf…