文章目录

  • 参数化 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来做出判断。
  • 单元测试似乎不受到特别的重视,或者说一个项目没有完整的单元测试?
  • 还需努力呀!

pytest实战--参数化parametrize+前置fixture相关推荐

  1. pytest框架中parametrize、fixture、request怎么混合使用?

    一.前言 作为软件测试工程师想必大家对于pytest框架并不陌生吧,那么今天呢笔者想和大家唠唠pytest框架中的parametrize.fixture.request的混合使用,如果你还不知道什么是 ...

  2. pytest中参数化方法,并且根据执行的命令进行动态参数化

    pytest中参数化的几种方法 @pytest.mark.parametrize 元组组成的列表进行参数化,每一组元素表示一组参数化值 每个参数单独赋值 添加用例id pytest.param, 针对 ...

  3. 【pytest】(十)fixture参数化-巧用params和ids优雅的创建测试数据

    我们都知道参数化. 比如我要测试一个查询接口/test/get_goods_list,这个接口可以查询到商品的信息. 在请求中,我可以根据请参数goods_status的不同传值,可以查询到对应状态的 ...

  4. pytest.5.参数化的Fixture

    From: http://www.testclass.net/pytest/parametrize_fixture/ 背景 继续上一节的测试需求,在上一节里,任何1条测试数据导致断言不通过后测试用例就 ...

  5. Pytest之参数化

    VOL 154 02 2020-09 今天距2021年120天 这是ITester软件测试小栈第154次推文 点击上方蓝字"ITester软件测试小栈"关注我,每周一.三.五早上  ...

  6. python测试框架之Pytest(二) : 测试用例的前置setup后置teardown用法

    目录 pytest中的前置和后置 类内外执行:方法细化级setup/teardown 类外执行:模块级(setup_module/teardown_module) 类外执行:函数级(setup_fun ...

  7. pytest_参数化parametrize

    前言 pytest.mark.parametrize装饰器可以实现测试用例参数化. parametrizing 1.这里是一个实现检查一定的输入和期望输出测试功能的典型例子 import pytest ...

  8. pytest 前置后置用法之 Fixture、setup、teardown

    文章目录 前言 使用 setup 和 teardown 实现 方法介绍 方法级别 类级别 模块级别 整体案例 执行结果 使用 Fixture 实现 方法介绍 使用 Fixture 完成前置方法 所有用 ...

  9. 【pytest】概述pytest——setup、teardown方法和conftest中的fixture用法,来执行测试用例的前置/后置条件语句操作

    大家好,我是好学的小师弟.今天和大家分享下-在pytest中的前置/后置操作. 所谓的前置/后置操作,就是在测试用例执行前,你预先要执行的一些步骤:在测试用例执行完毕后,你要执行的一些数据清理/备份工 ...

最新文章

  1. 拿来就能用!如何用 AI 算法提高安全运维效率?
  2. 如何使用Spring Cloud实现高并发微服务设计
  3. WML元素及其语法格式一览表
  4. 原 水质监测系统解决方案
  5. 计算机辅助工艺设计张胜文,计算机辅助工装设计.ppt
  6. 面试必会系列 - 5.1 网络BIO、NIO、epoll,同步/异步模型、阻塞/非阻塞模型,你能分清吗?
  7. 【CF1230E】Kamil and Making a Stream【GCD性质】【暴力vector】
  8. matlab常用误差分析绘图函数
  9. MSDN 离线帮助文档 官网极速下载直达
  10. kettle日志解析_Kettle运行日志记录
  11. H264编码常用参数整理
  12. 新计算机分区,全新的电脑怎么给新硬盘分区?
  13. 电路维修知识-可控硅
  14. 个人年终述职报告PPT怎么做?
  15. clamav --reload 加载病毒库源码分析
  16. 店铺logo设计免费在线生成
  17. 系统吞吐量、QPS、并发数、响应时间,以及提高吞吐量的思路
  18. 51Nod ProjectEuler 48
  19. 第二证券|北向资金全年净买入约900亿元 哪些行业和个股成“香饽饽”
  20. 给Macbook Pro更换固态硬盘并转移系统的最简单办法

热门文章

  1. NA-NP-IE系列实验36:扩展ACL
  2. UVA 116 Unidirectional TSP DP
  3. oracle 内存分配和调优 总结
  4. Oracle官方教程之Fork/Join
  5. 添加Net4CollectionTypeFactory的原因
  6. 【Go语言】LiteIDE使用的个人使用方法
  7. tcpdump移植和使用
  8. 小程序门店自提功能开启,酷客多带你玩转O2O模式
  9. es6箭头函数(=)与展开特性运算符(...)的使用
  10. IDEA热部署基于maven的web项目