pytest

发布时间 2023-05-28 20:07:46作者: lucilla

一、web自动化内容
UI - user interface
web网页、客户端(PC,app)

1、pytest

2、selenium
selenium介绍、元素定位、元素操作

python+selenium:
框架:
PageObject模式
优化和封装 - selenium二次封装、失败截图、执行过程输出、异常信息输出

selenium原理

appium

###################################这是分隔线###################################
二、pytest初识
unittest
写用例 TestCase
收集用例 TestLoader.discover()
生成报告 HtmlTestRunner
模板化的东西

pytest
能够运行unittest用例
灵活

共同点
测试框架:
均通过python来编写测试用例、收集用例、运行用例、生成报告

不同点
一、编写用例

1、编写用例
unittest:继承TestCase
pytest:函数/类里面的方法 -- 用例名称必须以test_开头。如果用例在类中,类名必须以Test开头

2、前置后置
unittest:setup/teardown setupClass/teardownClass

pytest:
方案一:
沿用unittest的风格
1、用例级别:setup/teardown -- 类里面的用例和类外的用例都可以
2、类级别:setup_class/teardown_class -- 类用
3、模块级别:setup_module/teardown_module --模块用

方案二:
fixture

3、断言
unittest:self.assertXXXXX()
pytest:assert 表达式

二、收集用例和运行用例
实际项目:用例分散在多个文件当中
unittest:TestLoader.discover(目录) - 收集到套件当中,run方法去执行
pytest:
不需要写代码去收集用例 - 自动收集/发现用例的方式
执行用例的时候会自动收集:
pytest命令行:pytest [参数]

(1)如何自动收集用例?
1、目录 - 从哪个目录下开始搜索用例
rootdir:pytest命令在哪个目录下运行,就以哪个目录为rootdir

2、文件名 - 符合test_*.py或者*——test.py条件的文件名,一定有用例

3、函数/类下的方法 - 函数名以test_开头
                - 以Test开头(不含__init__)的类下的test_开头

(2)收集并运行用例:
方式一:
    命令行:pytest -s -v  控制台显示详细的用例执行情况
方式二:
    python文件:pytest.main()
    执行顺序
    1、文件名:ASCII
    2、文件内部:按代码先后顺序

三、生成测试报告
unittest:HtmlTestRunner、BeautifulReport
pytest:有非常多的插件
(1)html-插件
html插件安装命令:pip install pytest-html

    (2)allure插件
    allure插件安装命令:pip install allure-pytest
    allure命令行工具下载地址:https://repo.maven.apache.org/maven2/io/qameta/allure/allure-commandline/
    allure serve

    (3)重运行-插件

官方文档:https://docs.pytest.org/en/stable/
pytest+allure+jenkins集成:https://www.cnblogs.com/Simple-Small/p/11512337.html
pytest:https://www.cnblogs.com/Simple-Small/tag/pytest/

###################################这是分隔线###################################
三、fixtrue用法
一、前置后置
unittest:
setup/teardown
setup得到的变量,怎么传递给测试用例:self.XXX = value
setupClass/teardownClass
setupClass得到的变量,怎么传递给测试用例:self.XXX = value

pytest:
    方案一:沿用unittest的风格
        1、用例级别:setup/teardown  -- 类里面的用例和类外的用例都可以
        2、类级别:setup_class/teardown_class  -- 类用
        3、模块级别:setup_module/teardown_module  --模块用

    方案二:fixture-- 详解

二、fixture:先定义,再调用和共享
(1)定义:
1、函数实现,函数名称不固定 -- 如何知道是前置后置?
@pytest.fixture
def fix():
pass

2、前置操作和后置操作,写在一个函数里 -- 怎么区分哪些是前置代码?后置代码?
    @pytest.fixture
    def fix():
        前置代码
        yield  #分隔线
        后置代码

3、4个作用域:测试函数(function)、测试类(class)、测试模块文件(module)、测试会话(session)
    @pytest.fixture(scope=function(默认值)/class/module/session)
    def fix():
        前置代码
        yield  #分隔线
        后置代码

4、不跟测试类/测试用例放在一起 -- 如果测试类需要使用,怎么办?需要的时候再调用

5、前置操作得到的一些数据,如何传递给测试用例?
    yield 返回值

    在测试用例中:以fixture函数名作为用例参数。用例参数接受返回值
    测试函数的参数:1、fixture
                 2、参数化

6、共享机制:conftest.py -- 详解
    conftest.py  定义fixture,可以定义多个

(2)调用:
用例/类 主动调用:哪儿需要哪儿调

调用方式:
@pytest.mark.usefixtures("fixture的函数名称")
测试类/测试函数

如果fixture有返回值:
那么函数名作为测试函数的参数时,则可以不用使用:@pytest.mark.usefixtures("函数名称")

(3)共享
conftest.py共享
1.所在目录下全面共享
2.支持嵌套