当前位置: 首页 > 编程日记 > 正文

pytest实战--参数化parametrize+前置fixture

文章目录

        • 参数化 parametrize
          • 适用场景
          • 一个典型的例子
        • 前置fixture+参数化
          • 适用场景
          • 一个典型的例子
          • 示例2
        • 个人疑问?

pytest既可以用来做单元测试,也可以用来做自动化接口测试,pytest可以结合allure生成漂亮的测试报告,经过一段时间的学习,记录下在单元测试中用到的比较常用的方法

参数化 parametrize

适用场景

在学习pytest的时候学的时候用的最多且最先学习的是参数化,

  • 他的应用场景是:比如我需要用自己设计的用例来调用某一个函数多次,当我设计了10个不同的用例,那么我就需要调用十次函数。
  • 以常规的思路想,循环也可以做到啊。但是pytest有参数化这个强大的功能。
一个典型的例子
# content of test_expectation.py# coding:utf-8import pytest
#这里设置了三组测试用例,每组用例用()来表示,用例之间用“,”隔开
@pytest.mark.parametrize("test_input,expected",[ ("3+5", 8),("2+4", 6),("6 * 9", 42),])
def test_eval(test_input, expected):  #此处用参数化命名的参数名assert eval(test_input) == expected#
if __name__ == "__main__":pytest.main(["-s", "test_canshu1.py"])

运行结果:

================================== FAILURES ===================================
_____________________________ test_eval[6 * 9-42] _____________________________test_input = '6 * 9', expected = 42@pytest.mark.parametrize("test_input,expected",[ ("3+5", 8),("2+4", 6),("6 * 9", 42),])def test_eval(test_input, expected):
>       assert eval(test_input) == expected
E       AssertionError: assert 54 == 42
E        +  where 54 = eval('6 * 9')test_canshu1.py:11: AssertionError
===================== 1 failed, 2 passed in 1.98 seconds ======================

前置fixture+参数化

适用场景

在继参数化之后用到的一个功能强大的是前置fixture

  • 应用场景1:用例1需要先登录,用例2不需要登录,用例3需要
    先登录
  • 应用场景2:比如说你需要实例化一个类之后再分别调用里面的各个函数,而且是需要在实例化的时候传入几个不同的用例(参数化解决)
  • 以常规的做法来做场景2,需要在每个函数调用的时候都实例化一次,所以fixture前置来做实例化(例2会有示例)
一个典型的例子
# coding:utf-8import pytest# 不带参数时默认scope="function"
@pytest.fixture()
def login():print("输入账号,密码先登录")def test_s1(login):print("用例1:登录之后其它动作111")def test_s2():  # 不传loginprint("用例2:不需要登录,操作222")def test_s3(login):print("用例3:登录之后其它动作333")if __name__ == "__main__":pytest.main(["-s", "test_fix.py"])

运行结果:

============================= test session starts =============================
platform win32 -- Python 3.6.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0
rootdir: E:\YOYO, inifile:
collected 3 itemstest_fix.py 输入账号,密码先登录
用例1:登录之后其它动作111
.用例2:不需要登录,操作222
.输入账号,密码先登录
用例3:登录之后其它动作333
.========================== 3 passed in 0.06 seconds ===========================
示例2
#coding = utf-8
import os,re
import sys
lib_path = os.path.abspath(os.path.join('E:\测试项目\models'))
sys.path.append(lib_path)
import pytest
import dataModel as A
import logging
import pandas as pd
import numpy as np
from utils.type_processing import stringToTimelogging.basicConfig(level=logging.DEBUG,format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')#五个需要测试的用例,参数化需要用到的参数
data = [("E:\测试项目\讲话.xlsx"),("E:\测试项目\党章党规目录(2019年6月26日版).xls"),("E:\测试项目\lilun.txt"),("E:\\测试项目\\test1.xlsx"),("E:\\测试项目\\test1.txt")]#前置fixture,范围为module,代表每个class执行一次
@pytest.fixture(scope = "module")
def a(request):filepath = request.paramx = A.DataModel(filepath)  #此处是实例化print("现在测试的是文件 %s" % filepath)return x#参数化,把上面五个用例传入,a代表前置fixture
@pytest.mark.parametrize("a",data,indirect=True)
class TestData(object):#存在title的文件def test_title(self,a):C = a  if C.df.empty:print("文件为空")else:msg = "文件的标题为空"title = C.extract_title()assert title != -1,msgdef test_author(self,a):C = aif C.df.empty:print("文件为空")else:msg = "文件的作者为空"author = C.extract_author()assert author != -1,msgdef test_content(self,a):C = aif C.df.empty:print("文件为空")else:#msg = "文件的标题为空"content = C.extract_content()assert content is not Nonedef test_time(self,a):C = aif C.df.empty:print("文件为空")else:msg = "文件的时间为空"time = C.extract_time()assert time != -1,msg
为什么参数化函数@pytest.mark.parametrize("a",data,indirect=True) 
参数a为前置fixture?解答:注意在参数化那里写了一个indirect=True的参数,所以前面“a”为前置,后面的data为参数化的参数名。

个人疑问?

  • pytest的应用场景那么广,但是为什么网上的单元测试的代码或者博文却很少,大多数都是做的接口自动化?
  • 如果pytest应用于单元测试,那么断言对于我来说,通常是一个比较大的障碍,因为大多时候一个函数的输出,在用参数化的时候,输出的结果不能用统一的assert来做出判断。
  • 单元测试似乎不受到特别的重视,或者说一个项目没有完整的单元测试?
  • 还需努力呀!

相关文章:

Matlab与机器学习 -- BP网络神经元上的转移函数

本图文详细介绍了BP神经网络常用的转移函数及其导数,单极性Sigmoid函数,双极性Sigmoid函数,线性函数。

在baidu上找到自己

在baidu上搜了我经常用的用户名,找到了这里,一看都满屋子都是灰尘,我打扫了一下。也清理了自己。发现那时的自己好冲动、好小孩。 其实现在也一样。我不想去否认自己的过去,但也不想公开这段过去。因为它在这个废弃的屋子里很安静…

selenium--iframe之模拟qq空间登录

文章目录前言分析切换iframe前言 我在模拟登录qq的时候,发现无论如何都定位不了qq的“账号密码登录”,怎么都进不去qq的登录页面,如下图所示 分析 打开 https://qzone.qq.com/然后点击二维码登录这块,背景出现了灰色&#xff…

Java读取Properties配置文件

目录1.Properties类与Properties配置文件2.Properties中的主要方法3.示例1.Properties类与Properties配置文件Properties类继承自Hashtable类并且实现了Map接口,使用键值对的形式来保存属性集。不过Properties的键和值都是字符串类型。2.Properties中的主要方法(1)l…

《C#精彩实例教程》小组阅读02 – Visual Studio简介与安装

本图文详细介绍了什么是Visual Studio,以及Visual Studio的安装过程。 上一次我们介绍了Visual Studio 2015的下载,以及MSDN。 这一次,我们说说什么是Visual Studio以及如何安装。 Visual Studio(简称VS)是微软公司…

从.NET寻找出路

自从成了金融危机的牺牲品之后,一直在寻找出路. 从.NET开发人员 到 待业青年, 再到现在的 技术支持,有些茫然,不知道未来在哪里!! 工作一年半,发现给别人打工没啥发展&#xff0c…

关于高速光耦6n137的使用总结_光耦使用中的那点事1

目前通用的隔离器件有光耦、变压器隔离、电容耦合等三大主流方式。其中光耦和变压器隔离使用的较多,有很多地方都可以见到。本次推送主要介绍光电耦合器的几个使用注意事项,以下截图数据来源于TLP785的数据手册。1、延时时间大家可以看到在5V供电情况下&…

javascript回调函数笔记

来源于:https://github.com/useaname/blog-study 在Javascript中,函数是第一类对象。意味函数可以像对象一样按照第一类被管理使用。回调函数是从一个叫函数式编程的编程范式中衍生出来的概念。简单来说,函数式编程就是使用函数作为变量。函数…

工厂方法模式与抽象工厂模式的区别

工厂方法模式: 一个抽象产品类,可以派生出多个具体产品类。 一个抽象工厂类,可以派生出多个具体工厂类。 每个具体工厂类只能创建一个具体产品类的实例。 抽象工厂模式: 多个抽象产品类,每个抽象产品类可以派生出多个具…

LSGO代码小组第18周复盘日志

LSGO软件技术团队第18周代码小组学习复盘日志。

唐山松下焊接机器人编程招聘_机器人四小家族-松下Panasonic专注焊接

在日本松下的网站,机器人是和焊接系统方案是在一起的。松下机器人的历史(来源于松下公司网站)1980年松下AW系列弧焊机器人投放上市,机器人系统之间采用的是单向模拟通讯方式模拟通讯的机器人1983年示教的容易化1988年减少干涉的设…

基于Matlab的BP神经网络在非线性函数拟合中的应用

本图文详细介绍了如何利用Matlab神经网络工具箱实现BP神经网络对非线性函数的拟合。

aligned_storage简单学习

#include <iostream> #include <type_traits> #include <string>/* template< std::size_t Len, std::size_t Align default-alignment >struct::type aligned_storage; 相当于一个内建的POD类型他的大小是Size他的对齐方式是Align */ template<c…

有关高级关系引擎中存在错误

SQL server2005 Analysis Services项目中出现以下错误 高级关系引擎中存在错误。 无法与 DataSourceID 为“Adventure Works DW”、名称为“Adventure Works DW”的数据源建立连接。 但是数据源测试连接是好使的&#xff0c;搜到已解决办法&#xff0c;数据源对里双击&#xf…

c#中接口的使用方法图解_C#图解教程 第十五章 接口

接口什么是接口接口是指定一组函数成员而不实现它们的引用类型。所以只能类和结构来实现接口。这种描述比较抽象&#xff0c;直接来看个示例。下例中&#xff0c;Main方法创建并初始化了一个CA类的对象&#xff0c;并将该对象传递给PrintInfo方法。classCA{public stringName;p…

提高C#编程水平的50个要点

1.总是用属性 (Property) 来代替可访问的数据成员 2.在 readonly 和 const 之间&#xff0c;优先使用 readonly 3.在 as 和 强制类型转换之间&#xff0c;优先使用 as 操作符 4.使用条件属性 (Conditional Attributes) 来代替条件编译语句 #if 5.总是为自定义类重载 ToString 方…

1.6 INSERT语句

1.6 INSERT语句正在更新内容&#xff0c;请稍后

基于Matlab的多层BP神经网络在非线性函数拟合中的应用

本图文详细介绍了如何利用Matlab神经网络工具箱实现多层BP神经网络对非线性函数的拟合。

华为云大数据存储的冗余方式是三副本_大数据入门:HDFS数据副本存放策略

大数据处理当中&#xff0c;数据储存始终是一个重要的环节&#xff0c;从现阶段的市场现状来说&#xff0c;以Hadoop为首的大数据技术框架&#xff0c;仍然占据主流地位&#xff0c;而Hadoop的HDFS&#xff0c;在数据存储方面&#xff0c;仍然得到重用。今天的大数据入门分享&a…

linux调试C++错误: 程序中有游离的‘\240’‘\302’

今天在网上找到一个小程序&#xff0c;一编译出现一大堆的错误&#xff1a; 程序中有游离的 ......开始觉得可能我从网页上直接复制的代码中有别的字符。于是把中文的全角空格全部替换了。这次好多了&#xff0c;少了一些&#xff0c;不过还有很多&#xff0c;调试信息说是XX行…

IE8下不识别indexOf的问题

1、为Array原型添加indexOf方法(如果学过面向对象,相当于给Array类添加实例方法),方法体如下: //添加数组IndexOf方法 if (!Array.prototype.indexOf){Array.prototype.indexOf function(elt /*, from*/){var len this.length >>> 0;var from Number(arguments[1])…

《C#精彩实例教程》小组阅读05 -- C#变量与常量

本微信图文介绍了C#的变量与常量。

k均值聚类算法考试例题_一文读懂K-means聚类算法

1、引言什么是聚类&#xff1f;我们通常说&#xff0c;机器学习任务可以分为两类&#xff0c;一类是监督学习&#xff0c;一类是无监督学习。监督学习&#xff1a;训练集有明确标签&#xff0c;监督学习就是寻找问题&#xff08;又称输入、特征、自变量&#xff09;与标签&…

《C#精彩实例教程》小组阅读06 -- C#运算符与表达式

本微信图文介绍了C#的运算符与表达式。

kvm启动报错

[rootstorage ~]# virsh -c qemu:///system list error: failed to connect to the hypervisor error: Failed to connect socket to /var/run/libvirt/libvirt-sock: No such file or directory原因&#xff1a;libvirt未启动解决方法[rootstorage ~]# libvirtd -d [rootst…

邀请参加活动的邀请函_圣诞节活动策划邀请函在线制作

2020年就要过去了&#xff0c;许多人说这一年很难&#xff0c;难上加南。莎士比亚说凡是过去&#xff0c;皆为序章。无论好的还是坏的终究会成为过往&#xff0c;向前看吧。圣诞节快要到来&#xff0c;商场开始布置精致的橱窗&#xff0c;电商巨头也在忙着做促销&#xff0c;幼…

比较全的字符串验证类,有人顶的话以后继续发

啥也不说看代码哈~ Codeusing System;using System.Collections.Generic;using System.Text;using System.Text.RegularExpressions;namespace Utility { public class ISExt { private static ISExt instance null; public static ISExt GetInstance…

设计模式(2)工厂方法模式(Factory Method)

设计模式&#xff08;0&#xff09;简单工厂模式 设计模式&#xff08;1&#xff09;单例模式&#xff08;Singleton&#xff09; 源码地址 0 工厂方法模式简介 0.0 工厂方法模式定义 工厂方法模式是在简单工厂模式基础上&#xff0c;为解决更复杂的对象创建问题而衍生进化出来…

基于Matlab的遗传算法优化BP神经网络在非线性函数拟合中的应用

本微信图文详细介绍了遗传算法优化BP神经网络初始权值阈值的过程&#xff0c;并通过实例说明该优化能够提升BP神经网络的预测精确程度。

android 加载h5页面部分机型滑动卡顿回弹_网易爆款H5 的交互方法参考

在早些年&#xff0c;H5其实更像是手机上的PPT&#xff0c;只支持点击、滑动这些基础手势操作。以内容展示为主&#xff0c;交互形式为辅。但到了今天&#xff0c;H5的玩法已经有了质的突破。不仅交互形式超多&#xff0c;形式与内容也能紧密结合&#xff0c;产生11大于2的效果…