Pytest测试框架快速搭建

一、介绍

pytest是一个非常成熟的Python测试框架,能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytest+requests);pytest具有很多第三方插件,并且可以自定义扩展,比较好用的如pytest-selenium(集成selenium)、pytest-html(完美html测试报告生成)、pytest-rerunfailures(失败case重复执行)、pytest-xdist(多CPU分发)等。

二、安装

 安装命令:pip install pytest

验证安装:pytest --version

安装测试报告模板:pip install pytest-html

安装失败后重新执行模板: pip install pytest-rerunfailures

三、pytest约束规则

1、文件名要满足test_*.py格式或*_test.py格式。

2、测试类以Test开头,并且不能带有 init 方法(注意:定义class时,需要以T开头,不然pytest是不会去运行该class的,正是由于有Test开头做标识,不需要init方法启动(个人理解))

3、类中,方法以test开头,可以包含一个或多个test_开头的函数。 在执行pytest命令时,会自动从当前目录及子目录中寻找符合上述约束的测试函数来执行。

4、批量执行,脚本名以 test 开头。

四、编写脚本

import pytest
 
# 被测试函数
def add(a, b):
    return a + b
 
class TestCase:
    # 测试脚本
    def test_add(self):
        assert 3 == add(1, 2)
 
 
if __name__ == '__main__':
    pytest.main()

通过断言,检验定义的方法 add 输出的结果是否符合预期

五、运行

方式:输入命令:pytest  参数 命令 脚本

 

 collected 2 items :表示加载到两个测试用例;
六、常用参数

1、-v 输出详细的信息

2、-s 输出测试函数或测试方法print内容

3、-k 如: -k “add” 执行所有测试用例名中含有“add”的用例

4、-m按分类执行测试点; 如 -m a  则对标记为a 的用例进行测试,不标记为a 的用例不会被执行;

5、-x  执行中有fail失败的用例,立刻停止

6、--maxfail  执行失败的最大次数,如果设定最大失败的次数是2, 那么如果两个用例执行失败, 后面的会停止执行;如 pytest --maxfail =2

7、–tb=line 错误信息在一行展示

七、参数化

 例如进行接口测试时,测试登录功能,上传图片功能等;可能只是字符串长度不一样、字符种类不一样,文件大小不一样,或是否为空等,但是执行的用例是一样的,这样为了方便,不用重复写;可以使用参数化,把不同的参数,传到同一个用例里。      

@pytest.mark.parametrize('a',[1,2,3,4,5])
def test(a):
    print(a)
 
if __name__ == '__main__':
    pytest.main()

八、前置后置

模块级:该方法表示只能类外面执行用例过程中,作用范围为当前模块,当前模块执行前后都运行一次前置和后置;无论有多少个用例,模块级的前置和后置都只跑一遍。

setup_module(),前置,模块执行前运行一次;

teardown_module(),后置,模块执行后运行一次;

函数级:该方法表示在类外面执行用例过程中,作用范围为当前面模块中的每一个测试函数,模块中的每个用例执行前后分别运行一次。

setup_function(),前置,每个用例执行前运行一次

teardown_function,后置,每个执行后运行一次;

类级别:作用范围为当前类中的每一个测试用例,当前类执行前后分别运行一次。只执行1次测试前置和测试后置

setup_class(),前置,类中执行前运行一次

 teardown_class,后置,类中执行后运行一次;

方法级:作用范围为类中的每个测试方法,每次执行测试用例前,测试前置和测试后置都会执行一次。

setup_method()或setup();前置,每个用例执行前运行一次

teardown_method()或teardown();后置,每个执行后运行一次;

import pytest
 
def setup_module():
    print("\n模块前置!")
 
def teardown_module():
    print("模块后置!")
 
def setup_function():
    print("函数前置!")
 
def teardown_function():
    print("函数后置!")
 
 
@pytest.mark.parametrize('a',[1,2,3,4,5])
def testModule(a):
    print(a)
 
 
@pytest.mark.parametrize('a',[6,7])
def testAdd(a):
    print(a)
 
 
class Testcase:
    def setup_class(self):
        print("类前置")
 
    def teardown_class(self):
        print("类后置")
 
    def setup_method(self):
        print("方法前置!")
 
    def teardown_method(self):
        print("方法后置!")
 
    @pytest.mark.parametrize('a', [8, 9])
    def test(self,a):
        print(a)
 
 
if __name__ == '__main__':
    pytest.main()

九、测试实例

        一、验证登录的 测试用例

 

import pytest
import requests
 
#创建session对象,用于实现会话保持
req = requests.session()
 
#登录 接口
#提前在模块前置把要测试登录接口的数据录入到data里,如用户名过长、非法字符、过短,及密码、预期结果等;data的每组数据为用户名、密码、预期结果
#通过参数化,就可以对所有用例运行一遍,把返回结果与预期结果比对;
#@pytest.mark.parametrize('data',data)
def test_login(data)
    url = 'http://192.168.0.1:8080/login'
    data ={'username':data[0],'pwd':data[1]}
    r = requests.post(url,data)
    assert data[2] == r.text
    print(r.text)
 
 
if __name__ == '__main__':
    #运行,并保存报告
    pytest.main(['-v',-f'--html={report_path}/{t}.html',case_path])

二、 验证 template.wps.com 的搜索接口:
把测试用例写好放到:E:/automationtest/searchParameter.xls ,为了方便处理,Excel表格每列一个参数;参数部分如图:
 

  代码:

import xlrd
import pytest
import requests
 
#获取工作薄文件对象
wb = xlrd.open_workbook("E:/automationtest/searchParameter.xls")
#返回Excel文件中所有的sheet对象,通过对象调用 name 返回sheet名称
sheets = wb.sheets()
 
#sheet名获取指定的表
sheet = wb.sheet_by_name("Sheet1")
 
#用list 保存从xls表读取出来的数据,这些都是要做接口测试的参数;
list=[]
for index in range(1,sheet.nrows):
    list.append(sheet.row_values(index,7,14))
    index = index + 1
 
for index in list:
    print(index)
 
#第n行,第m列的元素
#   value = sheet.cell(n,m).value
 
 
 
#取出所有参数,做参数化;
'''
#不能用下面这种方式做;否则就是所有参数的全组合;
#这种类型的参数化是所有的组合;不是4列;
@pytest.mark.parametrize("platf", platf)
@pytest.mark.parametrize("excludePayTemplate", excludePayTemplate)
@pytest.mark.parametrize("is_excluded", is_excluded)
@pytest.mark.parametrize("excluded_member_discount", excluded_member_discount)
@pytest.mark.parametrize("keyword", keyword)
@pytest.mark.parametrize("start", start)
@pytest.mark.parametrize("count", count)
'''
@pytest.mark.parametrize("list", list)
def testSearch(list):
    url = "https://template.wps.com/server/pf/template"
    param = {'platf': list[0],'excludePayTemplate':list[1],'is_excluded':list[2],'excluded_member_discount':list[3],'keyword':list[4],'start':list[5],'count':list[6]}
    response = requests.get(url=url,params=param)
#输出响应码和响应信息;也可以把预期结果当做一个参数传进来做断言判断
    print(response.status_code,'  ',response.text,'\n')
 
if __name__ == "__main__":
    pytest.main(["-s", "testSearch.py"])

  项目结构: 

case:保存每个接口的测试脚本;

common:保存公共模块,如数据库操作、CVS文件读取等

data:保存每个接口的测试用例

report:用于保存测试报告
 

十、fixture         

介绍:

前面提到前置、后置;编写用例时候需要用到用例的前置和用例的后置,可以用setup_class和teardown_class等帮助我们完成,但是不够完善而且灵活性不够强。例如:一个calss中有3条用例,其中2条需要登录,1条不需要登录,这个时候如果在用setup和teardown来做就有点不方便。fixture可以用做测试 用例的前置和后置操作,且fixture命令规范没有setup、teardown的格式。可以随意命名。控制fixture的前置和后置操作是通过yield关键字进行区分,代码在yield前面的属于前置操作,代码在yield后面的属于后置操作。且fixture不要求前后置同时存在,可以只存在前置或只存在后置。fixture如果有后置内容,无论遇到什么问题,都会进行执行后置的代码。

 使用:

用 @pytest.fixture()  装饰器声明一个函数是 fixture,如果测试函数的参数列表中包含 fixture 名,那么 pytest 就会检测到,并在运行测试函数之前运行它,fixture 可以返回数据给测试函数。
        
参数列表:

@pytest.fixture(scope="function", params=None, autouse=False, ids=None, name=None)

scope 可选参数,默认为 function ,可选值为 function、class、module、session,范围依次增加。session的作用域是整个测试会话,即开始执行pytest到结束测试。

autouse:默认:False,需要用例手动调用该fixture;如果是True,所有作用域内的测试用例都会自动调用该fixture

name:默认:装饰器的名称,同一模块的fixture相互调用建议写个不同的name

 

import pytest
 
@pytest.fixture
def login():
    print("先登录")
    yield
    print("退出登录 ")
 
 
def test_s1(login):
    print("测试用例 1:登录后的其它操作!")
 
 
def test_s2():  # 不传 login
    print("测试用例 2:不需要登录,")
 
 
 
 
if __name__ == '__main__':
        pytest.main()

十一、HTML报告生成

 一种是Pytest的 pytest-html插件,另一种是 allure-pytest插件;

使用pytest-html生成html测试报告:

安装pytest-html插件:pip install pytest-html

运行命令: --html=reportname.html,其中 reportname为要生成报告的名称。

如:针对 test.py 生成报告,在 terminal 输入:pytest --html=report.html test.py

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

 这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取  

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是从0到1使用 Docker + Jenkins + Git + Pytest + Allure 搭建项目自动化框架的步骤: 1. 安装 Docker 和 Docker Compose 首先,需要在服务器上安装 Docker 和 Docker Compose。Docker是一个虚拟化平台,可以通过容器化技术快速部署应用程序。Docker Compose是一个工具,可以定义和运行多个 Docker 容器的应用。 2. 创建 Git 仓库 创建一个 Git 仓库来管理应用程序的源代码。可以使用 GitLab、GitHub 或 Bitbucket 等 Git 托管服务。 3. 编写 Pytest 测试 编写 Pytest 测试测试应用程序的功能。Pytest 是一个 Python 测试框架,可以用于测试 Python 应用程序的各个方面,包括单元测试、集成测试和端到端测试。 4. 安装 Jenkins 安装 Jenkins 作为持续集成和持续交付的工具。Jenkins 是一个开源 CI/CD 工具,可以自动化构建、测试和部署应用程序。 5. 配置 Jenkins 配置 Jenkins 以连接 Git 仓库和 Docker 守护进程。在 Jenkins 中,需要设置 Git 仓库的地址和凭据,以便 Jenkins 可以拉取代码并构建 Docker 镜像。 6. 构建 Docker 镜像 使用 Dockerfile 构建 Docker 镜像。Dockerfile 是一个包含构建 Docker 镜像所需指令的文本文件。 7. 运行 Pytest 测试 使用 Docker Compose 运行 Pytest 测试。Docker Compose 可以定义和运行多个 Docker 容器的应用。在这里,需要定义一个包含测试和应用程序容器的 Docker Compose 文件。 8. 生成 Allure 报告 使用 Allure 生成测试报告。Allure 是一个测试报告框架,可以生成漂亮且易于阅读的测试报告。 以上就是使用 Docker + Jenkins + Git + Pytest + Allure 搭建项目自动化框架的基本步骤。当然,具体实现还需要根据你的应用程序进行相应的调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值