pytest_01_安装和入门

目录

  • pytest

    • 安装与入门

      • 1.pip install -U pytest
      • 2.创建一个test01.py的文件
      • 3.在该目录下执行pytest(venv)
      • 4.执行多个,新建一个py文件 test02.py
      • 5.在一个类中组合多个测试
      • 6.指定测试 用例
      • 7.Assert
      • 8.Fixture
      • 执行顺序
      • 数据清理

pytest

安装与入门

1.pip install -U pytest

2.创建一个test01.py的文件

def func(x):
    return x + 1

def test_answer():
    assert func(3) == 5

3.在该目录下执行pytest(venv)

D:\4_code\study>pytest
============================= test session starts =============================
platform win32 -- Python 3.6.2, pytest-3.7.1, py-1.5.4, pluggy-0.7.1
rootdir: D:\4_code\study, inifile:
collected 1 item

test01.py . [100%]

========================== 1 passed in 0.19 seconds ===========================

(venv) D:\4_code\study>pytest

4.执行多个,新建一个py文件 test02.py

def add(x, y):
    return x + y

def test_add():
    assert add(1, 0) == 1
    assert add(1, 1) == 2
    assert add(1, 99) == 100

执行pytest

(venv) D:\4_code\study>pytest
============================= test session starts =============================
platform win32 -- Python 3.6.2, pytest-3.7.1, py-1.5.4, pluggy-0.7.1
rootdir: D:\4_code\study, inifile:
collected 2 items

test01.py . [ 50%]
test02.py . [100%]

========================== 2 passed in 0.30 seconds ===========================

pytest将在当前目录及其子目录中运行test _ * .py或* _test.py形式的所有文件。

5.在一个类中组合多个测试

一旦开发了多个测试,您可能希望将它们分组到一个类中。pytest可以很容易地创建一个包含多个测试的类:

class TestClass(object):
    def test_one(self):
        x = "this"
        assert 'h' in x

    def test_two(self):
        x = "hello"
        assert hasattr(x, 'check')

(venv) D:\4_code\study>pytest
============================= test session starts =============================
platform win32 -- Python 3.6.2, pytest-3.7.1, py-1.5.4, pluggy-0.7.1
rootdir: D:\4_code\study, inifile:
collected 4 items

test_calc.py . [ 25%]
test_class.py .F [ 75%]
test_quick_start.py . [100%]

================================== FAILURES ===================================
_____________________________ TestClass.test_two ______________________________

self = <test_class.TestClass object at 0x058A59F0>

def test_two(self):
    x = "hello"
  assert hasattr(x, 'check')
  E       AssertionError: assert False
  E        +  where False = hasattr('hello', 'check')

test_class.py:16: AssertionError
===================== 1 failed, 3 passed in 0.37 seconds ======================

6.指定测试 用例

(venv) D:\4_code\study>pytest -q test_calc.py
. [100%]
1 passed in 0.02 seconds

7.Assert

pytest使用的是python自带的assert关键字来进行断言
assert关键字后面可以接一个表达式,只要表达式的最终结果为True,那么断言通过,用例执行成功,否则用例执行失败

断言异常抛出

import pytest

def test_zero_division():
    with pytest.raises(ZeroDivisionError):
        1 / 0

1/0的时候应该抛出ZeroDivisionError,否则用例失败,断言不通过。

8.Fixture

如测试数据为

[
  {"name":"jack","password":"Iloverose"},
  {"name":"rose","password":"Ilovejack"},
  {"name":"tom","password":"password123"}
]
import pytest
import json

class TestUserPassword(object):
    @pytest.fixture
    def users(self):
        return json.loads(open('./users.dev.json', 'r').read()) # 读取当前路径下的users.dev.json文件,返回的结果是dict

    def test_user_password(self, users):
        # 遍历每条user数据
        for user in users:
            passwd = user['password']
            assert len(passwd) >= 6
            msg = "user %s has a weak password" %(user['name'])
            assert passwd != 'password', msg
            assert passwd != 'password123', msg
(venv) D:\4_code\study>pytest test_user_password.py
============================= test session starts =============================
platform win32 -- Python 3.6.2, pytest-3.7.1, py-1.5.4, pluggy-0.7.1
rootdir: D:\4_code\study, inifile:
collected 1 item                                                               

test_user_password.py F                                                  [100%]

================================== FAILURES ===================================
_____________________ TestUserPassword.test_user_password _____________________

self = <test_user_password.TestUserPassword object at 0x044783B0>
users = [{'name': 'jack', 'password': 'Iloverose'}, {'name': 'rose', 'password': 'Ilovejack'}, {'name': 'tom', 'password': 'password123'}]

    def test_user_password(self, users):
        # 遍历每条user数据
        for user in users:
            passwd = user['password']
            assert len(passwd) >= 6
            msg = "user %s has a weak password" %(user['name'])
            assert passwd != 'password', msg
>           assert passwd != 'password123', msg
E           AssertionError: user tom has a weak password
E           assert 'password123' != 'password123'

test_user_password.py:16: AssertionError
========================== 1 failed in 0.26 seconds ===========================

使用@pytest.fixture装饰器可以定义feature
在用例的参数中传递fixture的名称以便直接调用fixture,拿到fixture的返回值
3个assert是递进关系,前1个assert断言失败后,后面的assert是不会运行的,因此重要的assert放到前面
E AssertionError: user tom has a weak password可以很容易的判断出是哪条数据出了问题,所以定制可读性好的错误信息是很必要的
任何1个断言失败以后,for循环就会退出,所以上面的用例1次只能发现1条错误数据,换句话说任何1个assert失败后,用例就终止运行了

执行顺序

pytest找到以test_开头的方法,也就是test_user_password方法,执行该方法时发现传入的参数里有跟fixture users名称相同的参数
pytest认定users是fixture,执行该fixture,读取json文件解析成dict实例
test_user_password方法真正被执行,users fixture被传入到该方法

使用下面的命令来查看用例中可用的fixtures

pytest --fixtures test_user_password.py

------------------ fixtures defined from test_user_password -------------------
users
    test_user_password.py:6: no docstring available

======================== no tests ran in 0.07 seconds =========================

数据清理

有时候我们需要在用例结束的时候去清理一些测试数据,或清除测试过程中创建的对象,我们可以使用下面的方式

import smtplib
import pytest

@pytest.fixture(scope="module")
def smtp():
    smtp = smtplib.SMTP("smtp.gmail.com", 587, timeout=5)
    yield smtp  # provide the fixture value
    print("teardown smtp")
    smtp.close()
yield 关键字返回了fixture中实例化的对象smtp
module中的用例执行完成后smtp.close()方法会执行,无论用例的运行状态是怎么样的,都会执行

原文地址:https://www.cnblogs.com/mrwuzs/p/9536458.html

时间: 2024-08-03 03:51:39

pytest_01_安装和入门的相关文章

Apache CouchDB安装及入门 &nbsp;

1. 从Apache CouchDB官网下载最新的版本,目前最新版本为1.6.1. 2. 运行"setup-couchdb-1.6.1_R16B02.exe"文件,并将couchdb设置为Windows服务,这样就不用每次都启动服务. 3. 在浏览器中运行"http://127.0.0.1:5984",出现下面的内容说明安装成功. {"couchdb":"Welcome","uuid":"4f58

bower安装使用入门详情

bower安装使用入门详情 bower自定义安装:安装bower需要先安装node,npm,git全局安装bower,命令:npm install -g bower进入项目目录下,新建文件1.txt然后命令行进入项目目录下,输入命令重命名该文件为.bowerrc:修改文件名,命令:rename 1.txt .bowerrc*说明下为何要命令行修改文件名,因为直接修改的话电脑不让修改啊,另外上面命令用于window~~.bowerrc文件内容填充,如下:(js/lib是通过bower下载的文件存放

nodejs学习笔记之安装、入门

由于项目需要,最近开始学习nodejs.在学习过程中,记录一些必要的操作和应该注意的点. 首先是如何安装nodejs环境?(我用的是windows 7环境,所以主要是windows 7的例子.如果想看linux下的安装可以参考http://www.cnblogs.com/meteoric_cry/archive/2013/01/04/2844481.html) 1. nodejs提供了一些安装程序,可以去官网(http://nodejs.org/download/)按照自己的机器进行下载,下载完

Lombok 安装、入门 - 消除冗长的 java 代码

前言:    逛开源社区的时候无意发现的,用了一段时间,觉得还可以,特此推荐一下.    lombok 提供了简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 java 代码.特别是相对于 POJO,光说不做不是我的风格,先来看看吧.lombok 的官方网址:http://projectlombok.org/  lombok 其实到这里我就介绍完了,开个玩笑,其实官网上有 lombok 三分四十九秒的视频讲解,里面讲的也很清楚了,而且还有文档可以参考.在这里我就不扯太多,先来看一下 l

MongoDB+MongoVUE安装及入门

MongoDB+MongoVUE安装及入门 转自CSDN 前言及概念 环境安装 MongoDB的安装 MongoVUE安装 建立连接 基础操作 创建表 添加数据 查询 日期查询 排序Sort 查询字段Fields skip跳过 Limit分页 修改 删除数据 前言及概念 据说nodejs和MongoDB是一对好基友,于是就忍不住去学习了解了一下MongoDB相关的一些东西, 那么,MongoDB是什么?这里的五件事是每个开放人员应该知道的: MongoDB是一个独立的服务器; 如MySQL或Po

Lombok 安装、入门 - 消除冗长的 java 代码(转)

原文出处:http://www.blogjava.net/fancydeepin/archive/2012/07/12/lombok.html 前言:    逛开源社区的时候无意发现的,用了一段时间,觉得还可以,特此推荐一下.    lombok 提供了简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 java 代码.特别是相对于 POJO,光说不做不是我的风格,先来看看吧. lombok 的官方网址:http://projectlombok.org/ lombok 其实到这里我就介绍

Apache Hadoop2.x 边安装边入门

完整PDF版本:<Apache Hadoop2.x边安装边入门> 目录 第一部分:Linux环境安装 第一步.配置Vmware NAT网络 一. Vmware网络模式介绍 二. NAT模式配置 第二步.安装Linux操作系统 三. Vmware上安装Linux系统 四.设置网络 五.修改Hostname 六.配置Host 七.关闭防火墙 八.关闭selinux 第三步.安装JDK 九.安装Java JDK 第二部分:Hadoop本地模式安装 第四步. Hadoop部署模式 第五步.本地模式部署

八:Lombok 安装、入门 - 消除冗长的 java 代码

Lombok 安装.入门 - 消除冗长的 java 代码 前言:    逛开源社区的时候无意发现的,用了一段时间,觉得还可以,特此推荐一下.    lombok 提供了简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 java 代码.特别是相对于 POJO,光说不做不是我的风格,先来看看吧. lombok 的官方网址:http://projectlombok.org/ lombok 其实到这里我就介绍完了,开个玩笑,其实官网上有 lombok 三分四十九秒的视频讲解,里面讲的也很清楚了

Qt安装与入门

一.Qt SDK1.2安装 准备QtSdk-offline-win-x86-v1_2_1.exe离线安装包. 安装QtSDK时注意不要有中文路径,空格以及特殊字符.可以自定义选择组件安装,也可以默认安装(默认安装可能只会安装VS2010编译环境下的qtcreator),若想安装mingw编译环境(qt自带mingw4.4版本)下的qtcreator,则需要通过自定义选择组安装. 二.Qt入门实例 Qt是诺基亚公司的一款开源GUI软件框架,本身是基于C++的.运行效率非常的高,不仅可以用于手机应用