首页 > 其他分享 >pytest

pytest

时间:2024-09-04 17:18:21浏览次数:7  
标签:用例 self assert test pytest print def

一、Pytest特点

基于Python语言的自动化测试框架最知名的有如下

1、 unitest

2、 pytest

3、 robotframework

前两款框架主要聚焦在开发者的白盒单元测试

而robotframework主要聚焦在系统测试上。

Pytest可以用来做系统测试的自动化,它的特点有:

1、 用Python编写测试用例,简便易用

2、 可以用文件系统目录层次对应手工测试用例层次结构

3、 灵活的初始化清除机制

4、 可以灵活挑选测试用例执行

5、 利用第三方插件,可以生成不错的报表

Pytest的功能非常多,我们这里主要介绍常用的功能。

安装

直接执行如下命令即可安装pytest

pip install pytest

我们还需要产生测试报表,所以需要安装一个pytest-html,执行如下命令安装

pip install pytest-html

 二、快速上手

Pytest如何知道你哪些代码是自动化的测试用例

官方文档给出了pytest寻找测试项的具体规则

1、 如果未指定命令行参数,则从testpath(如果已配置)或当前目录开始收集

如果命令行参数,指定了目录、文件名或node id的任何组合,则按参数来找

2、 寻找过程会递归到目录中,除非它们匹配上norecursedirs

3、 在这些目录中,搜索由其测试包名称导入的test_*.py或*_test.py文件

4、 从这些文件中,收集如下测试项:

test为前缀的函数

Test为前缀的类里面的test为前缀的方法。

测试用例代码

首先,我们编写的测试用例代码文件,必须以test_开头,或者以_test结尾

比如我们创建一个文件名为test_错误登录.py,放在目录autotest\cases\登录下面。

其中autotest是我们创建的自动化项目根目录。

Test_错误密码.py

class Test_错误密码:
    def test_c001001(self):
        print('\n用例C001001')
        assert 1==1

    def test_c001002(self):
        print('\n用例C001002')
        assert 2 == 2

    def test_c001003(self):
        print('\n用例C001003')
        assert 3 == 2

运行用例,打开cmd,进入项目根目录

显示找到3个测试项,2个执行通过,1个执行不通过。

通过的用例用一个绿色小点表示,不通过的用例用一个红色的F表示,并且会在后面显示具体不通过的用例和不通过的检查点代码细节。用例代码中有些打印语句没有显示出具体内容,如果想显示测试代码中print的内容,可以加上命令行参数-s。

pytest -s

如果希望得到更详细的执行信息,包括每个测试类、测试函数的名字,可以加上参数-v,这个参数可以和-s合并为-sv

pytest -sv

执行pytest时,如果没有指定目标目录或者文件,它会自动搜索当前目录下所有符合条件的文件、类、函数。所以上面,就找到了3个测试方法,对应3个用例。我们目前项目根目录中只有一个cases目录用例存放测试用例,将来还会有其他目录。

产生报告

前面安装pytest,我们也安装了pytest-html插件,这个插件就是用来产生测试报告的。要产生报告,在命令行加上参数—html=report.html –self-contained-html,如下

pytest cases --html=report.html --self-contained-html

生成报告

三、初始化清除

对于自动化测试框架来说,初始化清除功能至关重要。

模块级别

模块级别的初始化、清除分别在整个模块的测试用例执行前后执行,并且只会执行1次。它主要是用来为该模块中所有的测试用例做公共的初始化和清除。

如下定义setup_module和teardown_module全局函数

Test_错误密码.py

def setup_module():
    print("\n *** 初始化-模块 ***")
def teardown_module():
    print("\n *** 清除-模块 ***")

class Test_错误密码:
    def test_c001001(self):
        print('\n用例C001001')
        assert 1==1

    def test_c001002(self):
        print('\n用例C001002')
        assert 2 == 2

    def test_c001003(self):
        print('\n用例C001003')
        assert 3 == 2

class Test_错误密码2:
    def test_c002001(self):
        print('\n用例C001001')
        assert 1==1

    def test_c002002(self):
        print('\n用例C001002')
        assert 2 == 2

    def test_c002003(self):
        print('\n用例C001003')
        assert 3 == 2

运行结果:

方法级别

方法级别的初始化、清除分别在每个测试方法执行前后执行,并且每个用例分别执行1次,如下定义setup_class和teardown_class类方法

Test_错误密码.py

def setup_module():
    print("\n *** 初始化-模块 ***")
def teardown_module():
    print("\n *** 清除-模块 ***")

class Test_错误密码:

    @classmethod
    def setup_class(cls):
        print("\n *** 初始化-类 ***")

    @classmethod
    def teardown_class(cls):
        print("\n *** 清除-类 ***")

    def setup_method(self):
        print("\n *** 初始化-方法 ***")

    def teardown_method(self):
        print("\n *** 清除-方法 ***")

    def test_c001001(self):
        print('\n用例C001001')
        assert 1==1

    def test_c001002(self):
        print('\n用例C001002')
        assert 2 == 2

    def test_c001003(self):
        print('\n用例C001003')
        assert 3 == 2

class Test_错误密码2:
    def test_c002001(self):
        print('\n用例C001001')
        assert 1==1

    def test_c002002(self):
        print('\n用例C001002')
        assert 2 == 2

    def test_c002003(self):
        print('\n用例C001003')
        assert 3 == 2

运行结果:

类级别

类级别的初始化、清除分别在整个类的测试用例执行前后执行,并且只会执行1次。

Test_错误密码.py

def setup_module():
    print("\n *** 初始化-模块 ***")
def teardown_module():
    print("\n *** 清除-模块 ***")

class Test_错误密码:

    @classmethod
    def setup_class(cls):
        print("\n *** 初始化-类 ***")

    @classmethod
    def teardown_class(cls):
        print("\n *** 清除-类 ***")

    def setup_method(self):
        print("\n *** 初始化-方法 ***")

    def teardown_method(self):
        print("\n *** 清除-方法 ***")

    def test_c001001(self):
        print('\n用例C001001')
        assert 1==1

    def test_c001002(self):
        print('\n用例C001002')
        assert 2 == 2

    def test_c001003(self):
        print('\n用例C001003')
        assert 3 == 2

class Test_错误密码2:
    def test_c002001(self):
        print('\n用例C001001')
        assert 1==1

    def test_c002002(self):
        print('\n用例C001002')
        assert 2 == 2

    def test_c002003(self):
        print('\n用例C001003')
        assert 3 == 2

运行结果:

目录级别

目录级别的初始化清除,就是针对整个目录执行的初始化、清除。我们在需要初始化的目录下面创建一个名为conftest.py的文件,里面的内容如下:

conftest.py

import pytest

@pytest.fixture(scope='package',autouse=True)
def st_emptyEnv():
    print(f'\n### 初始化-目录甲')
    yield

    print(f'\n### 清除-目录甲')

Test_错误密码.py

def setup_module():
    print("\n *** 初始化-模块 ***")
def teardown_module():
    print("\n *** 清除-模块 ***")

class Test_错误密码:

    @classmethod
    def setup_class(cls):
        print("\n *** 初始化-类 ***")

    @classmethod
    def teardown_class(cls):
        print("\n *** 清除-类 ***")

    def setup_method(self):
        print("\n *** 初始化-方法 ***")

    def teardown_method(self):
        print("\n *** 清除-方法 ***")

    def test_c001001(self):
        print('\n用例C001001')
        assert 1==1

    def test_c001002(self):
        print('\n用例C001002')
        assert 2 == 2

    def test_c001003(self):
        print('\n用例C001003')
        assert 3 == 2

class Test_错误密码2:
    def test_c002001(self):
        print('\n用例C001001')
        assert 1==1

    def test_c002002(self):
        print('\n用例C001002')
        assert 2 == 2

    def test_c002003(self):
        print('\n用例C001003')
        assert 3 == 2

运行结果如下:

 

  

  

 

  

 

  

 

 

  

  

  

  

  

 

  

  

 

标签:用例,self,assert,test,pytest,print,def
From: https://www.cnblogs.com/longlyseul/p/18396906

相关文章

  • 软件测试学习笔记丨Pytest+Allure测试计算器
    本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/31954二、项目要求2.1项目简介计算器是一个经典的编程场景,可以获取两个数据的计算结果。2.1.1知识点Pytest测试框架基本用法2.1.2受众初级测试工程师2.1.3作业内容使用Pytest编写自动化测试用例对相加函数进行测试......
  • Pytest解决报告日志等相对路径问题
    我们在使用pytest搭建测试框架时,有时候为了方便会将生成报告/日志等参数直接作为默认参数配置在pytest.ini中,如pytest.ini[pytest]addopts=-v--html=reports/report.html--alluredir=reports/allure_resultslog_file=logs/test.log需要pipinstallpytestpytest-h......
  • pytest中用装饰器控制新增接口请求时间
    示例场景假设我们有一个提交数据的函数submit_data,我们希望在每次调用后等待一定的时间,以避免重复提交的问题。1.自动化提交接口的时候可以使用time.sleep()的方式这是最直接的方式,在函数调用后直接使用time.sleep()控制等待时间。importtimedefsubmit_data(da......
  • pycharm警告 :PytestConfigWarning: Unknown config option: makers
    一、PytestConfigWarning:Unknownconfigoption:makers虽然不影响执行测试用例,但是,追求完美的我很想解决掉他! 二、找报错的单词在哪,大概率这种报错在ini文件我的makers在pytest.ini。起初是想打标签,但是标签的注解是@pytest.mark.xxx,所以就把makers改成了markers,果然没有......
  • Python自动化测试面试题总结_pytest框架面试题
    ???16、请用python脚本实现从1到100的求和。???17、编写一个匿名函数,使其能够进行加法运算,例如说输入1,2能计算结果为3???18、list_1=[1,2,1,2,15,4,3,2,1,2],去除list_1的重复值,并且从大到小排序。???19、统计字符串中的单词个数,这里的单词指的是连续的不是空格的......
  • Pytest常用装饰器
    在Pytest中,有一些常用的装饰器,它们可以帮助你更好地组织和管理测试用例。以下是一些常见的Pytest装饰器:@pytest.mark.parametrize:用于参数化测试用例。它允许你为一个测试函数提供多组参数,从而可以用不同的输入值来测试同一个功能。示例:`[email protected]......
  • pytest+allure生成测试报告
    1.安装allure-pytest插件allure生成报告是先生成结果再生成报告需要运行的代码:pytesttest_demo2.py--alluredir…report/tmp......
  • Python编码系列—Python单元测试的艺术:深入探索unittest与pytest
    ......
  • 【pytest】 在启动任务时将自定义参数传入代码中
    1.使用 pytest_addoption 钩子函数你可以在 conftest.py 文件中使用 pytest_addoption 钩子函数来定义自定义命令行参数。然后,你可以在你的测试文件中通过 request fixture来访问这些参数。conftest.py#contentofconftest.pyimportpytestdefpytest_ad......
  • pytest和unittest的几个区别
    主要区别1、安装需求:pytest:作为第三方单元测试库,需要额外安装。unittest:是Python标准库的一部分,无需额外安装。2、用例编写规则:pytest:编写规则较为简单,兼容性好,可以执行unittest风格的测试用例,无需修改unittest用例的任何代码。unittest:编写规则较为复杂,需要按照......