Pytest自动化测试框架 安装使用,解决乱码问题,教你一步步精简代码。

包含内容

pytest 安装
快速上手(测试用例代码 运行测试 产生报告)
初始化清除(模块级别 类级别 方法级别 目录级别
挑选用例执行( 指定一个模块 指定目录 指定模块里面的函数或者类 根据名字 根据标签)
实战案例
数据驱动

耐心看完会有收获的,最好配合例子操作

#-*- codeing=utf-8 -*-
#@Author:Ones
#@File:test_错误登录.py
#@Software:PyCharm
import pytest
'''
安装
pip install pytest
pip install pytest-html
'''
pytestmark=[pytest.mark.webtest1,pytest.mark.webtest2] #加一个全局变量,模块级标签

def setup_module():
    print('\n *** 初始化-模块 ***')


def teardown_module():
    print('\n ***   清除-模块 ***')


class Test_错误密码3:

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

    @classmethod
    def teardown_class(cls):
        print('\n === 清除 - 类 ===')

    def setup_method(self):
        print('\n --- 初始化-方法888  ---')

    def teardown_method(self):
        print('\n --- 清除  -方法888 ---')

    def test_C002001(self):
        print('\n用例C002001')
        assert 1 == 1

    def test_C002002(self):
        print('\n用例C002002')
        assert 2 == 2

    def test_C002003(self):
        print('\n用例C002003')
        assert 3 == 2


class Test_错误密码4:

    def test_C002021(self):
        print('\n用例C002021')
        assert 1 == 1

    @pytest.mark.smoke #加入一个标签,执行的时候可以只执行标签下面的例子,如 pytest -m smoke,会过滤其它用例只执行此用例,标签可以加到类、方法、或单个用例里。


    def test_C002022(self):
        print('\n用例C002022')
        assert 2 == 2

'''
进入到目录下 执行pytest 命令,也可以 pytest cases(或者指定一个执行目录 例如当前目录./)
希望现实测试代码中print的内容,加上命令行参数 -s,pytest -s
pytest  cases --html=report.html --self-contained-html
解决中文乱码问题:可以这样修复:

打开该插件对应的代码文件,通常在解释器目录下:site-packages\pytest_html\plugin.py

找到如下代码

  class TestResult:
      def __init__(self, outcome, report, logfile, config):
          self.test_id = report.nodeid.encode("utf-8").decode("unicode_escape")
改为

  class TestResult:
      def __init__(self, outcome, report, logfile, config):
          # 解决乱码问题
          # self.test_id = report.nodeid.encode("utf-8").decode("unicode_escape")
          self.test_id = report.nodeid
注意:一定要注意缩进。

'''
'''
指定一个类执行 pytest 登录\test_错误登录.py::Test_错误密码
执行类里面的一个方法 pytest 登录\test_错误登录.py::Test_错误密码::test_C001001
可以使用 命令行参数 -k 后面加名字来挑选要执行的测试项

比如像这样后面跟测试函数名字的一部分:

pytest -k C001001 -s
注意,-k 后面的名字

可以是测试函数的名字,可以是类的名字,可以是模块文件名,可以是目录的名字

是大小写敏感的

不一定要完整,只要能有部分匹配上就行

可以用 not 表示选择名字中不包含,比如

pytest -k "not C001001" -s
可以用 and 表示选择名字同时包含多个关键字,比如

pytest -k "错 and 密码2" -s
可以用 or 表示选择名字 包含指定关键字之一即可,比如

pytest -k "错 or 密码2" -s

加了标签之后执行 pytest -m 标签名
'''

上面的大家会发现问题,代码和测试用例都弄到一起了,我们想办法分开一下,所以优化了一下

分开一个是lib库,可以重复写的东西放在这里,定义一个函数loginAndCheck,另一个直接调用即可。
在这里插入图片描述
下面是具体的代码

#-*- codeing=utf-8 -*-
#@Time:2021/3/31 15:51
#@Author:Ones
#@File:webui.py
#@Software:PyCharm
import time
from selenium import webdriver
def loginAndCheck(username,password):

    print('\n用例UI_0001')
    driver = webdriver.Chrome()
    driver.implicitly_wait(10)
    url = 'http://127.0.0.1/mgr/sign.html'
    driver.get(url)
    if username is not None:
        driver.find_element_by_id('username').send_keys(username)
    if password is not None:
        driver.find_element_by_id('password').send_keys(password)
    driver.find_element_by_css_selector("button[type='submit']").click()
    time.sleep(2)
    alterText = driver.switch_to_alert().text
    print(alterText)

    driver.quit()

    return alterText
import time
import pytest
from selenium import webdriver
from Android.autotest.lib.webui import loginAndCheck
pytestmark=[pytest.mark.webtest3,pytest.mark.webtest4] #加一个全局变量,模块级标签
class Test_错误登录1:
    def test_UI_0000(self):
        print('\n用例UI_0000')
        alterText=loginAndCheck(None,'88888888')
        assert alterText == '请输入用户名'


    def test_UI_0002(self):
        print('\n用例UI_0002')
        alterText=loginAndCheck('byhy',None)
        assert alterText == '请输入密码'

    def test_UI_0003(self):
        print('\n用例UI_0003')
        alterText = loginAndCheck('byh', '88888888')
        assert alterText == '登录失败 : 用户名或者密码错误'

执行需要在工作目录 我的工作目录是D:\pythonWork,
D:\PythonWork>python -m pytest -m webtest3 --html=report.html --self-contained-html
webtest3是定义的一个模块标签,可以随便命名,也可以用其它方式执行,多种多样。上面有提到。
执行完会导出测试报告在工作目录里
在这里插入图片描述

这些测试用例它们测试步骤是一模一样的,只是输入的数据(用户名、密码)不同,要检查的输出数据(错误提示)不同。

这批测试用例,就是典型的 可以用 数据驱动 方式进行自动化的用例。

如果有一批测试用例,具有 相同的测试步骤 ,只是 测试参数数据不同 。

自动化测试时,把测试数据从用例代码中 分离 开来,以后增加新的测试用例,只需要修改数据。
这就是数据驱动,这里是写在代码里,也可以写在文件里,excel,txt,yaml等原理类似

import time
import pytest
from selenium import webdriver
from Android.autotest.lib.webui import loginAndCheck

pytestmark=[pytest.mark.webtest5,pytest.mark.webtest6] #加一个全局变量,模块级标签
class Test_错误登录:
    @pytest.mark.parametrize('username, password, expectedalert', [
        (None, '88888888', '请输入用户名1'),
        ('byhy', None, '请输入密码'),
        ('byh', '88888888', '登录失败 : 用户名或者密码错误'),
        ('byhy', '8888888', '登录失败 : 用户名或者密码错误'),
        ('byhy', '888888888', '登录失败 : 用户名或者密码错误'),
    ]
                             )
    def test_UI_0001_0005(self, username, password, expectedalert):
        alertText = loginAndCheck(username, password)
        assert alertText == expectedalert

可以执行看到结果
python -m pytest -m webtest5 --html=report.html --self-contained-html
也可以不输出报告
python -m pytest -m webtest5 -sv
也可以指定文件名执行,或者-k关键字段

到这里我们看见,其实还未实现真正的数据分离,这里我们可以借助数据驱动使用excel,或者yaml实现数据分离,详情参考以下链接
Pytest+POM+数据驱动yaml+Allure测试报告+Jenkins自动化测试,可持续集成
https://blog.csdn.net/zzhangsiwei/article/details/119559422
Selenium+POM+Unittest+数据驱动DDT/Yaml手把手教你实现企业级数据分离

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Onesiphorus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值