• po设计模式,pytest引入


    po设计思想

    1,什么是po

    pageobject是一种涉及模式

    减少冗余的代码和对代码进行管理

    分离测试步骤及测试对象

    2,po的好处

    提高代码复用率

    集中管理定位信息,提高可维护行,

    代码可复用,降低成本,

    不同po之间没有交叉,可团队并行开发

    po设计原则

    1,总的原则

    封装basepage,提取出来各个page中的公共方法

    所有的po继承basepage

    2,方法封装原则

    共有的方法,点击,输入内容,获取元素节点内容,等待

    滑动页面,执行js代码等等

    3,定位封装原则

    将每个po类的定位xpath分类做为类属性进行封装,命名风格统一,做到见名知意

    pytest引入

    pytest标记

    @pytest.mark.skip 在用例方法上使用,即可跳过用例的执行

    @pytest.mark.xfail 标记预期不会通过的用例

    自定义

    1,注册标记:在启动文件同级目录下创建一个 pytest.ini的配置文件

    2,在pytest.ini添加一个 pytest配置块

    3,在pytest的配置块下面加一个mjarkers的配置项

    4,在markers的配置项中去注册标记

    5,给对应的用例打标记,

    @pytest.mark.注册的标记名称

    [pytest]
    markers =
        addicated
        yuze
        class_
    • 给类打标记
      1,直接在类上面打
      2,通过类属性的pytestmark
    class TestDome1:
        pytestmark = [pytest.mark.class_, pytest.mark.musen]
    
        def test_demo1_01(self):
            assert 1 == 100
    
        def test_demo1_02(self):
            assert 100 == 100

    断言

    assert断言, 根据assert后面的表达式的结果是True还是False来决定是否断言通过

    原生的测试报告

    pip install pytest-html

     

    第一种 log 普通文本  TextTestRunner

     

    --resultlog=report/demo.txt  相对路径

    第二种 xml,生成xml文件

    --junitxml=report/demo.xml   jenkins使用
    html和xml 标记性语言

    第三种 html HTMLTestRunner

    --html=report/demo.html

     

    用例编写

    pytest编写用例,不使用ddt,因为不兼容,

    pytest中使用pytest.mark.parameterize来实现数据驱动,给用例传参

    注意点

    要么按照unittest的规则来写,数据驱动,前后置都用unittest中的

    要么按照pytest来写,数据驱动,前后置都是pytest中的

    回顾一下unittest中的ddt

    # --------------------unittest中的数据驱动实现--------------------------
    @ddt.ddt
    class TestClass(unittest.TestCase):
    
        def setUp(self):
            print("--用例的前置条件--")
    
        @ddt.data(11, 22, 333, 444, 55)
        def test_01(self, case):
            assert case < 100
    
        def tearDown(self):
            print("--用例执行的后置条件--")

    pytest的数据驱动实现

    @pytest.mark.parametrize('case',[11,22,33,44,155])
    def test_03(case):
        assert case < 100

    pytest的前后置方法

    用例级别

    @pytest.fixture()
    def case03_fixture():
        # 前置条件
        print("--------03----用例执行的前置条件--------------------")
        yield
        # 后置条件
        print("---------03---用例执行的后置条件--------------------")

    用例类级别

    # 类级别的前置后置
    @pytest.fixture(scope='class')
    def class_fixture():
        # 前置条件
        print("-------用例类-----执行的前置条件--------------------")
        yield
        # 后置条件
        print("-------用例类-----执行的后置条件--------------------")

    用例模块级别

    @pytest.fixture(scope='module', autouse=True)
    def module_fixture():
        # 前置条件
        print("-------模块-----执行的前置条件--------------------")
        yield
        # 后置条件
        print("-------模块-----执行的后置条件--------------------")

    会话级别

    @pytest.fixture(scope='session', autouse=True)
    def session_fixture():
        # 前置条件
        print("-------会话级别-----执行的前置条件--------------------")
        yield
        # 后置条件
        print("-------会话级别-----执行的后置条件--------------------")

    前置条件与用例数据交互

    @pytest.fixture()
    def case_fixture():
        # 前置
        driver = webdriver.Chrome()
        expected = 200
        yield driver, expected
        # 后置
        driver.quit()
    
    # @pytest.mark.usefixtures("case_fixture") 这个使用方法,
    #只限于不需要将前置条件中的数据传给用例的情况下
    class TestLogin02:
        """测试登录"""
        def test_login_pass(self, case_fixture):
            """正常登录的用例"""
            driver, expected = case_fixture
            driver.get("http://www.baidu.com")

    使用一变量接收来自前置执行的结果,前置将需要返回给用例的内容卸载yield后,就可以直接接收,

    注意:实例中注释掉的方法只限于 不需要将前置中的数据传给用例的情况下才适用。

    pytest与unittest之间的对比

    1,pytest兼容unittest,使用unittest写的用例,可以通过pytest去执行

    2,pytest写用例更简单

    3,加载用例更智能

    4,pytest可以对用例进行分类管理,执行用例更加的灵活

    5,unittest是python中的官方库,兼容性更好,更稳定,pytest在安装的时候可能会出现同python版本的兼容问题

    6,pytest支持的插件分厂丰富,功能扩展性强

    7,pytest用例执行的前置后置处理更加高级

  • 相关阅读:
    Flask学习 1创建第一个页面
    Flask教程
    微信服务号认证和不认证的区别
    python保存selenium的cookies写入和读出
    centos 无界面安装selenium+chrome+chromedirver的设置
    win7系统下安装Splash。
    ubuntu mysql5.6二进制安装
    Python socket实现处理多个连接
    Python 简单soket例子
    Python socket网络编程(通信介绍)
  • 原文地址:https://www.cnblogs.com/addicated/p/13194370.html
Copyright © 2020-2023  润新知