精华内容
下载资源
问答
  • pytest 自动化测试框架
  • pytest是python的一种单元测试框架,不python自带的unittest 测试框架类似,但是比 unittest 框架使用起来更简洁,效率更高。... 可以用来做 web 呾 app 自动化pytest+selenium/appnium)、 接口(pytest+requests)
  • 接口自动化测试-pytest框架

    千次阅读 2020-06-15 19:57:36
    1. 使用pytest完成接口自动化 1.1. pytest 简介 pytest 是 Python 的一款开源测试框架。 主要特点: 简单灵活,文档丰富; 能够支持单元测试、功能测试、接口自动化测试等; 具有众多第三方插件,且可以自定义...

    1. 使用pytest完成接口自动化

    1.1. pytest 简介

    pytest 是 Python 的一款开源测试框架。

    主要特点:

    • 简单灵活,文档丰富;
    • 能够支持单元测试、功能测试、接口自动化测试等;
    • 具有众多第三方插件,且可以自定义扩展;
    • 支持参数化,可控制测试用例的粒度;
    • 可以很好的和 CI 工具结合,例如 Jenkins 。

    1.2. 使用参考

    1.2.1. 命名约束

    • 测试文件以"test_"开头/以"_test"结尾
    • 测试类以"Test"开头,并且不能带有 __init__ 方法
    • 测试函数以"test_"开头

    默认情况下,pytest 查找当前目录下所有以 test 开始或结尾的 Python 脚本,并执行文件内的所有以 test 开始的函数和方法。

    1.2.2. 运行

    在终端按需输入以下命令来运行 case:

    • 运行所有 case :pytest 
    • 运行指定 case :pytest testCase/test_demo1.py
    • 运行关键字匹配的 case :pytest -k “表达式”
    • 运行标记匹配的 case :pytest -m "标记"
    • 运行后控制台展示详细信息:pytest -v
    • ...

    1.2.3. 断言assert

    pytest 中可以使用 Python 原生的断言语句 assert 来进行验证。

    常用:

    • assert xx:判断 xx 为真
    • assert not xx:判断 xx 不为真
    • assert a in b:判断 b 包含 a
    • assert a == b:判断 a 等于 b
    • assert a !=b:判断 a 不等于 b

    可以指定断言失败的返回信息,举例如下:

    assert response["result_code"] == expected["response"]["result_code"], "实际的返回结果是:{}".format(response["result_code"])

    1.2.4. fixture

    fixture 是 pytest 特有功能,目的是提供一种手段去运行最基本的、重复的测试内容,是将测试前后的预备工作、清理工作的代码分离出核心测试逻辑的一种机制。通常用来对测试方法、测试函数、测试类和整个测试文件进行初始化或还原测试环境。

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

    • scope:作用域,(

        function:方法,默认为function

        class:类

        module:.py文件

        session:会话)

    • params:可选的参数列表,可使多个参数调用fixture功能
    • autouse:是否默认调用该fixture,默认为False
    • ids:每个字符串id的列表
    • name:装饰器名字

     

    1.2.4.1. fixture 作为函数参数

    可以通过使用 @pytest.fixture 注册成为一个 fixture 函数,来为测试方法提供一个 fixture 对象。 

    如下图所示,connect_mysql_uds 函数被注册成了一个 fixture 函数,在 test_query_couplist 方法中可以直接被作为参数使用。

     

     

    1.2.4.2. 在 conftest.py 中管理 fixture

    如果多个文件都需要用到这个fixture函数,则可以将该函数放到conftest.py文件中管理,所需的 fixture 对象会自动被 pytest 发现。

     

    1.2.4.3. 执行顺序

    较高范围的 fixture(例如session会话级)比低范围的 fixture(例如function函数级或class类级)优先执行。

    相同范围的 fixture 对象的按引入的顺序或依赖关系按顺序调用。

     

    1.2.4.4. yield

    yield 语句之后的所有代码都视为 teardown 代码。

    举例,如下图所示,整个会话结束后,会打印出”关闭数据库”的语句。 

     

    1.2.5. mark

     

    1.2.5.1. 标记和分类用例

    @pytest.mark.level

    用法步骤:

    a. 先在 pytest.ini 文件中对标签进行注册

    b. 对用例进行标记

    @pytest.mark.P0

    c. 运行指定标记的用例

    在终端输入: pytest -m "P0"

     

    1.2.5.2. 标记跳过用例

    无条件跳过:@pytest.mark.skip(reason="跳过原因描述")

    在指定条件下跳过:@pytest.mark.skipif(condition, reason="跳过原因描述")

     

    1.2.5.3. 标记用例为预期失败

    @pytest.mark.xfail(reason="预期失败描述")

    对于功能未完成或已知有问题的用例,可以用 xfail 标记,这样即使断言失败,也不会影响其他测试用例的的执行。

    执行 case 后,控制台中显示:

    • XFAIL:表示预期失败,实际也失败
    • XPASS:表示预期失败,实际运行没有失败

     

    1.2.5.4. 参数化

    我们进行接口测试时,往往很多时候操作步骤都是一样的,只有数据不一样,这时候就可以使用参数化功能,来减少代码冗余。

    @pytest.mark.parametrize(argnames, argvalues, ids=None)

    • argnames:参数名称,字符串格式
    • argvalues:参数值列表,列表格式
    • ids:用例的 ID ,字符串列表格式

    举例,如下图所示,装饰器会自动对 list_params 解包并赋值给装饰器的第一参数。装饰器的第一个参数中逗号分隔的变量可以作为测试方法的参数,在测试方法内就可以直接获取这些变量的值。

    1.2.6. Allure

    Allure 是一种灵活、轻量级、多语言的测试报告工具,以简洁精美的 web 报告形式展示。

    Python 中有一个第三方库:allure-pytest,用于连接 pytest 和 allure ,使它们可以更好的配合使用。

    Allure的常用用法:

    使用方法

    说明

    @allure.epic()描述史诗,即未拆解的story
    @allure.feature()描述功能模块
    @allure.story()描述用户故事
    @allure.title()描述用例标题
    @allure.step()描述用例步骤
    @allure.severity()描述用例等级:blocker,critical,normal,minor,trivial

    报告的主要页面介绍:

    • Graphs

    该页面展示本次执行结果的统计信息,比如执行结果成功失败比例、测试用例等级分布、用例执行时间等。

    • Behaviors

    该页面根据代码中设定的 @allure.feature()、@allure.story() 等来展示用例执行的结果,这里可以看到用例执行的详细信息。

    展开全文
  • pytest-ui-web自动化框架 ###安装相关依赖 pip freeze > requirements.txt //将环境的当前包列表记录到 requirements.txt pip install -r requirements.txt //根据rf.txt安装项目依赖包 ###元素定位详解 ###运行执行...
  • web自动化测试-pytest

    2020-01-06 17:55:35
    1.自动发现测试模块和测试方法 |unittest 被动发现,程序员在代码中指定 2.断言使用assert+表达式即可 3.可以设置会话级、模块级、类级、函数级的fixtures 数据准备+清理工作(fixtrues对应unittest中的 ...

    pytest介绍

    基本unittest之上的单元测试框架

    1.自动发现测试模块和测试方法   |unittest 被动发现,程序员在代码中指定

    2.断言使用assert+表达式即可

    3.可以设置会话级、模块级、类级、函数级的fixtures 数据准备+清理工作(fixtrues对应unittest中的 setupclass() 、setup()

    、tearDownClass()、tearDown())

    安装命令:

    pip install pytest

    安装html报告插件:

    pip install pytest-html

    pytest插件地址:

    http://plugincompat.herokuapp.com/

    ===================================================================

    pytest-自动收集测试用例

    1.默认从当前目录中搜索测试用例,即在哪个目录下运行pytest命令,则从哪个目录当中搜索

    2.搜索规则:

    (1)符合命令规则 test_*.py   或者 *_test.py

    (2)以test_开头的函数名

    (3)以Test开头的测试类(没有__init__函数)当中,以test_开头的函数

    ==================================================================

    开发中遇到的两个注意事项

    1.pytest工程中,最大的目录下不能有__init__.py文件,容易运行时报错

    2.pytest工程中的缓存文件,如要拷贝别的工程中的,需要把缓存文件都删除。(每个文件中都会有,记得全删除)

     

    展开全文
  • github地址: https://github.com/wuranxu/webTest 基于Python的webUI自动化测试框架,支持多平台~带有自动下载chrome驱动功能
  • pytest是一个第三方单元测试框架,更加简单,灵活,而且提供了更加丰富的扩展,弥补了unittest在做web自动化测试时的一些不足。 1, pytest简单例子 pytest支持pip安装 ①:创建以test开头的文件名test_pytest.py ...

    pytest是一个第三方单元测试框架,更加简单,灵活,而且提供了更加丰富的扩展,弥补了unittest在做web自动化测试时的一些不足。

    1, pytest简单例子

    pytest支持pip安装

    ①:创建以test开头的文件名test_pytest.py

    def inc(x):
        return x + 1
    
    
    def test_answer():
        assert inc(3) == 5

    ②:切换到test_pytest.py所在目录,执行命令pytest

    结果如下(分为两部分截图):

    通过上面的例子,是不是可以感受到pytest的优点,它更加简单。首先,不必像unittest一样必须创建测试类;其次,使用assert断言也比使用unittest提供的断言方法更加简单。

    不过,它也有自己的规则测试文件必须以"test"开头,这也是在执行pytest命令时并没有指定测试文件也可以执行test_pytest.py文件的原因,因为该文件以“test”开头。

    那么能否可以通过main()方法执行测试呢?当然可以,pytest也提供了main()方法,如下创建test_pytest1.py:

    import pytest
    
    def inc(x):
        return x + 1
    
    
    def test_answer():
        assert inc(3) == 5
    
    
    if __name__ == '__main__':
        pytest.main()

    结果如下:

    这里可以看到有两个测试结果,一个是test_pytest.py中的,一个是test_pytest1.py中的,那么我只是直接执行了test_pytest1.py(没有使用pytest xxx.py方法执行文件),那么为什么会两个测试文件都会执行呢?????????????????

    因为main()方法默认执行当前文件夹内所有以“test”开头的文件内的以test开头函数

    2 pytest的基本使用方法

    这里我们主要介绍pytest与unittest之间的不同

    2.1 断言

        在unittest单元测试框架中提供了丰富的断言方法,如:assertEqual(),assertIn(),assertTrue(),assertIs()等方法。pytest单元测试框架并没有提供专门的断言方法,而是直接使用Python的assert进行断言。

    创建test_assert.py

    import pytest
    
    
    # 计算两个数的和
    def add(a, b):
        return a + b
    
    
    # 判断素数
    def is_prime(n):
        if n < 1:
            return False
        for i in range(2, n):
            if n % i == 0:
                return False
            return True
    
    
    # 测试相等
    def test_add_1():
        assert add(3, 4) == 7
    
    
    # 测试不相等
    def test_add_2():
        assert add(17, 22) != 50
    
    
    # 测试大于或等于
    def test_add_3():
        assert add(17, 22) <= 50
    
    
    # 测试小于或等于
    def test_add_4():
        assert add(17, 22) >= 38
    
    
    # 测试包含
    def test_in():
        a = "hello"
        b = "he"
        assert b in a
    
    
    # 测试不包含
    def test_not_in():
        a = "hello"
        b = "hi"
        assert b not in a
    
    
    # 判断是否为True
    def test_true_1():
        assert is_prime(13)
    
    
    # 判断是否为True
    def test_true_2():
        assert is_prime(7)
    
    
    # 判断是否不为True
    def test_true_3():
        assert not is_prime(4)
    
    
    # 判断是否不为True
    def test_true_4():
        assert is_prime(6) is not True
    
    
    # 判断是否为False
    def test_false_1():
        assert is_prime(8) is False
    
    
    if __name__ == '__main__':
        pytest.main()

     以上例子展示了pytest断言的方法,借助python的运算符号和关键字即可轻松实现不同数据类型的断言

    2.2 Fixture

        Fixture通常用来对测试方法,测试函数,测试类和整个测试文件进行初始化或还原测试环境。创建test_fixture.py文件。

    def mul(a, b):
        return a * b
    
    
    # ==============Fixture================
    def setup_module(module):
        print("setup_module---------->")
    
    def teardown_module(module):
        print("teardown_module-------->")
    
    def setup_function(function):
        print("setup_function--------->")
    
    def teardown_function(function):
        print("teardown_function------>")
    
    def setup():
        print("setup----------->")
    
    def teardown():
        print("teardown-------->")
    
    
    # =======测试用例=======
    def test_mul_3_4():
        print("test_mul_3_4")
        assert mul(3, 4) == 12
    
    def test_mul_a_3():
        print("test_mul_a_3")
        assert mul("a", 3) == "aaa"
    
    if __name__ == '__main__':
        import pytest
        pytest.main()

    这里主要用到的是模块级别和函数级别的Fixture

        ① setup_module/teardown_module:在当前文件中,在所有测试用例执行之前与之后执行

        ② setup_function/teardown_function:在每个测试函数之前与之后执行

        ③ setup/teardown:在每个测试函数之前与之后执行。这两个方法同样可以作用于类方法

    结果如下:

     

    pytest是支持使用测试类的,同样必须以"Test"开头,注意首字母要大写。在引入测试类的情况下,Fixture的用法如下:创建test_fixture1.py

    def mul(a, b):
        return a * b
    
    
    class TestMul():
    
        # ====fixture====
        @classmethod
        def setup_class(cls):
            print("setup_class--------->")
    
        @classmethod
        def teardown_class(cls):
            print("teardown_class-------->")
    
        def setup_method(self, method):
            print("setup_method--------->")
    
        def teardown_method(self, method):
            print("teardown_method------>")
    
        def setup(self):
            print("setup------->")
    
        def teardown(self):
            print("teardown------>")
    
        # 测试用例
        def test_num_7_8(self):
            print("test_num_7-8")
            assert mul(7, 8) == 56
    
        def test_num_d_5(self):
            print("test_num_d_5")
            assert mul("d", 5) == "ddddd"

    这里主要用到类级别和方法级别的Fixture:

        ①:setup_class/teardown_class:在当前测试类的开始和结束时执行

        ②:setup_method/teardown_method:在每个测试方法开始与结束时执行

        ③:setup/teardown:在每个测试方法开始与结束时执行,同样可以作用于测试函数

    结果如下:

    2.3 参数化

    当一组测试用例有固定的测试数据时,就可以通过参数化的方式简化测用例的编写。pytest本身是支持参数化的,不需要额外安装插件。创建test_parameterize.py

    import pytest
    import math
    
    # pytest参数化
    
    @pytest.mark.parametrize(
        "base, exponent, expected",
        [
            (2, 2, 4),
            (2, 3, 8),
            (1, 9, 1),
            (0, 9, 0)
        ],
        ids=["case1", "case2", "case3", "case4"]
    )
    def test_pow(base, exponent, expected):
        assert math.pow(base, exponent) == expected

    其用法与unittest的参数化插件类似,通过pytest.mark.parametrize()方法设置参数。

    "base, exponent, expected" 用来定义参数的名称。通过数组定义参数时,每一个元组都是一条测试用例使用的测试数据。ids参数默认为None,用于定义测试用例的名称。

    pow用来计算x的y次方的值。

    运行结果如下:

    "-v"参数增加了测试用例冗长。不设置id参数的结果如下:

    2.4 运行测试

    pytest提供了丰富的参数运行测试用例,在前面的例子中已经使用到了一些参数,例如,“-s”参数用于关闭捕捉,从而打印输出信息,“-v”参数用于增加测试用例冗长。

    pytest提供的参数比较多,下面只介绍常用的参数

    2.4.1 运行名称中包含某字符串的测试用例

    这里使用-k参数指定测试用例中包含add字符串的用例

    2.4.2 减少测试运行冗长

    这次运行减少了很多日志的输出,“-q”用来减少测试运行的冗长,也可以使用“-quiet”代替

    2.4.3 如果出现一条测试用例失败,则退出测试

    在test_assert.py文件中添加了如下测试用例,放到第一个测试用例之后,只为了看到效果:

    
    def test_fail():
        assert is_prime(9) is False

    这个参数一般用于测试调试阶段,当出现一条失败的测试用例时,应该先通过调试让这条测试用例运行通过,而不是继续执行后面的测试用例

    2.4.4 运行测试目录

    测试目录既可以指定相对路径,如上,也可以执行绝对路径

    2.4.5 指定特定类或方法执行

    这里指定运行test_fixture1.py文件中TestMul类下的test_num_7_8()方法,文件名、类名和方法名之间使用双冒号"::"分割开

    2.4.6 通过main()方法运行测试

    创建test_main.py文件,在文件中通过数组指定参数,每个参数为数组中的一个元素如下:

    import pytest
    
    if __name__ == '__main__':
        pytest.main(["-s", "./test_assert"])

    结果如下: 

    2.5 生成测试报告

    pytest支持生成多种格式的测试报告

    2.5.1 生成JUnit XML文件

    XML类型的日志主要用于存放测试结果,方便我们利用里面的数据定制自己的测试报告。

    结果如下:

    2.5.2 生成在线测试报告

    我测试时一直有出现一直卡在 “sending information to Paste Service”这里的情况,多测试几次。。。

    打开链接,结果如下:

    你可以只将失败的报告发送到pastebin服务器, pytest ./test_assert --pastebin=failed

    2.5.3 生成html测试报告文件

    需要安装pytest的插件,pytest-html,支持pip安装

    结果如下:

    2.6 conftest.py

    conftest.py是pytest特有的本地测试配置文件,既可以用来设置项目级别的Fixture,也可以用来导入外部插件,还可以用来指定钩子函数。

    ①:创建test_config/conftest.py测试配置文件如下:

    import pytest
    
    # 设置测试钩子
    
    @pytest.fixture()
    def test_url():
        return "http://www.baidu.com"
    

    ②:创建test_config/test_sub.py测试用例文件

    def test_baidu(test_url):
        print(test_url)

    这里创建的函数可以直接调用conftest文件中的test_url()钩子函数,结果如下:

    注意:conftest值作用于其所在的目录以及子目录

    3 pytest扩展

    pytest可以扩展非常多的插件来实现各种功能,这里介绍几个对做web自动化非常有用的插件 

    3.1 pytest-html

    前面已经介绍过,在这里不做说明了

    3.2 pytest-returnfailures

    需要使用pip安装

    创建test_returnfailures文件

    def test_fail_return():
        assert 2 + 2 == 5

    结果如下:

    通过 --reruns参数设置测试用例运行失败后的重试次数

    3.3 pytest-parallel扩展

    首先pip安装

    pytest-parallel扩展可以实现测试用例的并行执行

    创建文件如下:

    from time import sleep
    
    def test_1():
        sleep(3)
    
    def test_2():
        sleep(4)
    
    def test_3():
        sleep(7)
    
    

    不使用线程运行测试用例时间如下

    使用多线程方式:pytest -q test_parallel.py --tests-per-worker auto,             "auto"表示自动分配,但是测试不能在windows上执行,故不做结果展示

    pytest-parallel的更多用法

    
    
    pytest --worker 2
    
    
    pytest --worker auto
    
    
    pytest --tests-per-worker 4
    
    
    pytest --tests-per-worker auto
    
    
    pytest --workers 2 --tests-per-worker auto

     

     

    展开全文
  • selenium是一个开源的web ui自动化测试工具,详细就不再过多介绍了。 二、环境搭建 关于环境搭建,非常简单,可以参考我之前的博客。selenium新手入门 三、po设计 po(pom)模式:页面对象模型,把项目中的页面,封装...

    本篇文件利用当下流行的pom设计模式设置测试框架,编写测试用例,生成测试报告,并最终jenkins集成。

    一、selenium

    selenium是一个开源的web ui自动化测试工具,详细就不再过多介绍了。

    二、环境搭建

    关于环境搭建,非常简单,可以参考我之前的博客。selenium新手入门

    三、po设计

    po(pom)模式:页面对象模型,把项目中的页面,封装成一个一个类,一个页面对应一个类。再通过实例化这个类的对象,去调用类里面的属性和方法。
    好处:
    提高代码维护
    代码重复利用

    3.1 po分层

    3.1.1 基础层:

    基础层:放封装的selenium基础方法
    代码实现:

    
    class BasePage:
    
        def __init__(self,driver):
            self.driver=driver
    
    
        # 打开页面
        def into_testin(self,url):
            self.driver.get(url)
    
        # 定位元素
        def locate_element(self,args):
            return self.driver.find_element(*args)
    
        #定位一组元素
        def locate_eles(self,args):
            return self.driver.find_elements(*args)
    
        #输入值
        def input_(self,args,text):
            self.locate_element(args).send_keys(text)
    
        #点击按钮
        def click_button(self,args):
            self.locate_element(args).click()
    

    3.1.2 页面对象层

    页面对象层:pageobject,存放页面的元素定位和操作流程
    登录模块代码实现:

    from time import sleep
    from basepage.base_page import BasePage
    from selenium.webdriver.common.by import By
    
    
    class LoginPage(BasePage):
    
        '''定位页面元素'''
        
        #url
        testin_url='https://www.testin.cn/account/login.htm'
        
        #输入用户名和密码
        username_loc=(By.ID,'email')
        password_loc=(By.ID,'pwd')
    
        #点击登录按钮
        login_button=(By.ID,"submitBtn")
    
        #登录邮箱操作流程
        def testin_login(self,username='18170710339',password='Quyun1230'):
            self.into_testin(self.testin_url)
            sleep(2)
            self.locate_element(self.username_loc).send_keys(username)
            sleep(1)
            self.locate_element(self.password_loc).send_keys(password)
            sleep(1)
            self.click_button(self.login_button)
    

    选择手机代码实现:

    from time import sleep
    from basepage.base_page import BasePage
    from selenium.webdriver.common.by import By
    
    class SelectPage(BasePage):
    
        '''定位页面元素'''
        #定位弹窗
        win_loc=(By.XPATH,"//div[@class='modal-body']/i")
        #定位iphone
        ip_12pro_loc=(By.XPATH,'//div[@id="collapse_1"]/div/dl[1]/dd/div/span[2]/label/span')
        # 定位iphone12 pro max
        ip_loc = (By.XPATH, "//button[@device-source='00008101-0004102C3468001E']")
    
        #定位品牌
        an_loc=(By.XPATH,'//div[@id="collapse_1"]/div/dl[2]/dd/div/span[3]/label/span')
        # 定位安卓魅族
        mz_loc = (By.XPATH, "//button[@device-source='864968050654030']")
    
        #定位上市时间
        onlin_loc=(By.XPATH,'//div[@id="collapse_1"]/div/dl[6]/dd/div/span[5]/label/span')
        # 定位上市时间的华为荣耀
        sj_loc = (By.XPATH, "//button[@device-source='7d22ebd8f913637d']")
    
        #定位文本框
        text_detail=(By.XPATH,'//div[@id="modal_quota_alert"]/div/div/div[2]')
        #定位取消框
        qx_but_loc=(By.XPATH,'//div[@id="modal_quota_alert"]/div/div/div[3]/button[1]')
    
        #点击登录按钮
        login_button=(By.ID,"submitBtn")
    
        #登录邮箱操作流程
        def testin_select_01_iphone(self):
            sleep(1)
            self.locate_element(self.ip_12pro_loc).click()
            sleep(1)
            self.locate_element(self.ip_loc).click()
            sleep(1)
            as_text=self.locate_element(self.text_detail).text
            '''断言信息正确'''
            assert as_text==u'您的配额已不足,是否前往购买?'
            self.locate_element(self.qx_but_loc).click()
            sleep(2)
    
        def testin_select_02_android(self):
            sleep(1)
            self.locate_element(self.an_loc).click()
            sleep(1)
            self.locate_element(self.mz_loc).click()
            sleep(1)
            as_text = self.locate_element(self.text_detail).text
            assert as_text == u'您的配额已不足,是否前往购买?'
            self.locate_element(self.qx_but_loc).click()
            sleep(2)
    
        def testin_select_03_onlin_time(self):
            sleep(1)
            self.locate_element(self.onlin_loc).click()
            sleep(1)
            self.locate_element(self.sj_loc).click()
            sleep(1)
            as_text = self.locate_element(self.text_detail).text
            assert as_text == u'您的配额已不足,是否前往购买?'
            self.locate_element(self.qx_but_loc).click()
            sleep(2)
    

    3.1.3 测试用例层

    测试用例层:存放测试用例及数据
    代码实现:

    import pytest
    from time import sleep
    from selenium import webdriver
    from common.excel import read_excel
    from pageobject.login_page import LoginPage
    from pageobject.select_phone import SelectPage
    
    class TestTestIn:
    
        #打开浏览器
        def setup(self) -> None:
            self.driver=webdriver.Chrome()
            driver=self.driver
    
        def teardown(self) -> None:
            sleep(1)
            self.driver.close()
    
        '''利用excel导入登录测试数据'''
        @pytest.mark.parametrize('case',read_excel('./data/data.xlsx','login'))
        def test_01_login(self,case):
            '''测试登录模块'''
            xh,case_name,username,password,is_exc,result,bz=case
            lp=LoginPage(self.driver)
            lp.testin_login(username,password)
    
        def test_02_select_iphone_12(self):
            '''测试根据品牌选择手机'''
            lp = LoginPage(self.driver)
            lp.testin_login()
            ps=SelectPage(self.driver)
            ps.testin_select_01_iphone()
    
    
        def test_03_select_androi_sys(self):
            '''测试根据安卓系统选择手机'''
            lp = LoginPage(self.driver)
            lp.testin_login()
            ps=SelectPage(self.driver)
            ps.testin_select_02_android()
    
        def test_04_select_online_time(self):
            '''测试根据上市时间来选择手机'''
            lp = LoginPage(self.driver)
            lp.testin_login()
            ps=SelectPage(self.driver)
            ps.testin_select_03_onlin_time()
    
    

    3.1.4 创建测试数据

    登录模块,我们用到了数据驱动,我们先创建一个目录,如data,里面创建一个excel表,添加相应数据,如:
    在这里插入图片描述
    excel表中如下:
    在这里插入图片描述

    3.1.5 创建读取excel目录

    创建一个common目录,再创建一个read_excel的文件:
    在这里插入图片描述
    代码如下:

    import openpyxl
    
    def read_excel(excel_dir,sheet_name):
        '''读取excel'''
    
        #加载目录
        ex=openpyxl.load_workbook(excel_dir)
    
        #获取sheet页
        sheet=ex[sheet_name]
    
        #打印表最大行和列
        # print(sheet.max_row,sheet.max_column)
        # print(sheet.cell(2,1).value)
        #循环行和列
        sheet_list=[]
        for row in range(2,sheet.max_row+1):
            row_list=[]
            for col in range(1,sheet.max_column+1):
                row_list.append(sheet.cell(row,col).value)
            sheet_list.append(row_list)
        return sheet_list
    
    if __name__ == '__main__':
        read_excel('../data/data.xlsx','login')
    

    3.2 生成测试报告

    3.2.1 创建报告目录

    本次我们使用pytest测试框架,所以,当然使用allure测试报告了。如果不熟悉allure报告的朋友,可以参考我上一篇详细的介绍:单元测试框架–pytest从入门到精通2021最新教程
    先创建两个目录:一个临时目录:temp和存放测试报告的reports:
    在这里插入图片描述

    3.2.2 创建报告配置文件

    新建一个pytest.ini的文件:

    [pytest]
    #
    addopts=-vs --alluredir ./temp
    testpaths=./testcase
    python_files=test_*.py
    python_classes=Test*
    python_functions=test_*
    
    

    3.3 运行测试

    根据上面的操作,最终会形成这样的目录:
    在这里插入图片描述

    3.3.1 运行用例:

    创建一个run_test.py文件:

    import os
    import pytest
    from time import sleep
    
    if __name__ == '__main__':
        pytest.main()
        sleep(2)
        os.system('allure generate ./temp -o ./reports --clean')
    

    3.3.2 查看运行结果

    3.3.2.1 编辑器中结果

    在这里插入图片描述
    可以看出,结果全部运行通过。

    3.3.2.2 查看测试报告

    查看reports目录中的html测试,用浏览器打开:
    在这里插入图片描述
    在这里插入图片描述
    测试用例全部通过。

    四、jenkins集成

    如果不太熟悉jenkins的朋友,可以参考我之前的博客,有详细搭建教程:jenkins持续集成的使用(含RF自动执行自动化)

    4.1 启动jenkins

    cmd中进入jenkins目录,执行命令:

    java -jar jenkins.war
    

    在这里插入图片描述
    jenkins启动成功

    4.2 创建任务

    进入jenkins,创建一个任务:
    在这里插入图片描述
    添加项目目录:
    在这里插入图片描述
    设置运行命令:
    在这里插入图片描述
    保存,创建成功。
    任务创建成功后, 执行运行操作。
    在这里插入图片描述
    可以看到已经在运行了。
    在这里插入图片描述
    查看运行结果:
    在这里插入图片描述
    运行成功。测试报告,同上,就不再次看了。

    展开全文
  • python自动化测试框架-基于pytest

    千次阅读 2020-05-25 22:13:54
    通过selenium实现web UI自动化,appium+stf实现android UI自动化,保证前端页面操作功能及业务流程 通过pytest测试脚本进行管理,allure report 实现报告输出 通过maven实现脚本CI(jerkins),tomcat实现测试报告...
  • 框架只是对 selenium( webdriver ) 原生方法进行了简单的封装,精简为大约 30 个方法,这些方法基本能够胜任于我们的web自动化测试。基于 unittest 单元测试框架,所以测试文件与测试方法遵循unittest开发。自动...
  • 前段时间,九九姐更新了自动化测试中unittest框架,然后有很多小伙伴私聊九九姐,说想学习一下pytest框架的内容。既然大家已经说话了,九九姐怎么能不安排呢,所以今天就给大家说一说pytest框架。 今天这篇文章呢,...
  • pytest自动化测试框架使用讲解
  • Pytest接口自动化测试框架搭建模板

    千次阅读 2021-01-21 16:47:54
    测试框架: Pytest测试报告: Allure 项目源码Git地址 项目目录结构 api – 模仿PO模式, 抽象出页面类, 页面类内包含页面所包含所有接口, 并封装成方法可供其他模块直接调用 config – 配置文件目录 data – 测试...
  • 都有哪些种类的配置文件 pytest.ini:pytest的主配置文件,可以改变pytest的默认行为 ...setup.cfg: 也采用的是ini文件的格式,而且可以影响setup.py的行为,使用python setup.py test运行所有测试用例 py.
  • python pytest selenium 自动化测试框架搭建

    千次阅读 多人点赞 2020-07-01 15:39:46
    python pytest selenium 自动化测试框架搭建 公司一直有这个自动化测试需求,前期利用c++或者python进行了一些自动化脚本的编写。这几天没有版本更迭,基于前期的工作,把自动化测试整理了一部分功能模块。现在的...
  • 设置_headers为了减少再参数用例的时候减少headers: xxx的步骤 加上**kwargs的参数为了请求接口便于传入其他参数,例如cookies= xx, files= xx ''' def send(body, headers=None, **kwargs): if headers is Non
  • 最近在学习web自动化,所以在这里总结一下pytest框架。 其实pytest 和 unittest 都是自动化测试框架,但是pytest更好用一些,有以下几个优点:1)可以根据标签执行用例;2)??? 一、首先需要安装pytest ,使用...
  • 关于Web Ui 全自动化测试,我们用简单易学的python语言来编写测试用例;采用Python的单元测试框架Pytest去控制和运行测试用例;采用开源的Web Ui 测试框架Seleniumt提供的API操作界面元素;使用Saucelabs平台提供的...
  •  前面介绍了pytest框架一些基础知识与基本用法,掌握了一定基础后,我们可以进行项目实战,搭建pytest接口自动测试框架。  框架设计思路  画了一张草图,大家自行领会。  项目结构  源码展示  将test_...
  • Pytest自动化测试框架pytest是一个强大的python测试框架,支持参数化,可生成html报告,并且拥有众多第三方插件,提供给用户实现不同的需求。Pytest安装和基本使用一、Py...
  • 帮助你更好的书写程序 成熟全功能的Python测试工具 ...pytest升级时有很好的向后兼容性 丰富的在线和PDF文档 大量的第三方插件和内置帮助 在许多小型和大型项目和组织使用 许多测试实例 灵活 易学,...
  • python + selenium 自动化测试写久了发现selenium(webdriver)提供原生的方法并简便,于是,产生了二次封装的想法。想不到太炫酷的名字,于是各取了两个单词的前两个字母-- pyse。 特点: 所有方法只提供xpath定位...
  • 说明:该篇博客是博主一字一码编写的,实属不易,请...关于unittest框架,早在之前的《Python接口自动化测试框架实战开发(一)》、《Selenium3与Python3实战开发Web自动化测试框架(二)》、《Web自动化测试实战...
  • Pytest框架Web UI自动化中的介绍

    千次阅读 2019-05-27 11:08:00
    Pytest框架Web UI自动化中的介绍一、Pytest 是基于unittest 之上的单元测试框架二、Pytest 收集测试用例的规则三、Pytest 中Mark 功能四、Fixture 使用五、Pytest 可以生成多种样式的测试报告六、Pytest 提供的...
  • pytest用例执行顺序:1、文件名称的顺序,2、再就是测试用例代码顺序 功能讲解: fixtrue功能--共享前置后置 1、共享的方式:conftest.py文件(可以有多个conftest.py文件)。共享的范围:他爸爸下所有的测试用例...
  • 自动化测试框架pytest教程 项目简介 这里是python测试开发的日常记录,主要涉及单元测试、安全测试、python基础、性能测试等内容。 项目地址: https://bitbucket.org/xurongzhong/small_python_daily_tools ...
  • Pytest 自动化测试框架

    2021-10-09 21:02:21
    Pytest 自动化测试框架 Pytest和Unittest测试框架的区别? 如何区分这两者,很简单unittest作为官方的测试框架,在测试方面更加基础,并且可以再次基础上进行二次开发,同时在用法上格式会更加复杂;而pytest框架...
  • 一.什么是pytest ...能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试pytest+requests); pytest具有很多第三方插件,并且可以自定义扩展,比较好

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,579
精华内容 1,031
关键字:

web自动化测试框架pytest