zoukankan      html  css  js  c++  java
  • pytest+python 项目初步实践及生成allure报告

    前言:在使用unittest 框架时,发现其两个缺点:

    1、unittest 执行测试用例中每个.py文件时都要重新打开浏览器,无法实现一次性加载浏览器来执行所有用例(如:登录--》执行所有用例--》退出);

    2、unittest框架局限性,driver不能跨py模块使用。

    为了解决以上问题,于是就去学习了pytest框架并做了初步实践,如果写的不好,还请大家多指教!

     

    场景及操作步骤:

    1、登录(需要输入用户名、密码,点击登录按钮;登录成功后获取登录结果)

    2、新建用户 (登录以后可以新建用户)

    3、关闭浏览器

     

    一、pytest 的安装

    1、安装

    命令:pip install -U pytest

     2、查看版本

    命令:pip show pytest

     

    二、编写代码

    1、项目目录

    case : 存放测试用例

    common : 存放公共文件

    page: 封装页面业务

    report: 存放测试报告

    conftest.py : 文件名不能修改,同目录下所有测试文件运行前会执行此文件 

     2、base.py  文件,封装基本操作方法

    # -*- coding=utf-8 -*-
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium import webdriver
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.common.exceptions import TimeoutException
    
    
    
    class Base(object):
    
        def __init__(self, driver):
            self.driver = driver
    
        def find(self, locator):
            """locator = ("id","kw"),查找某元素"""
            try:
                element = WebDriverWait(self.driver, 10, 1).until(lambda x: x.find_element(*locator))
                return element
            except TimeoutException as msg:
                print("元素不存在")
    
        def send(self, locator, text):
            """输入框传值,元素不存在时跳过执行"""
            try:
                self.find(locator).clear()
                self.find(locator).send_keys(text)
            except TimeoutException as msg:
                # print("元素不存在",msg)
                pass
    
        def click(self,locator):
            """点击事件"""
            self.find(locator).click()

    3、login.py  文件,登录的业务代码

    # -*- coding=utf-8 -*-
    from selenium import webdriver
    import time
    from common.base import Base
    
    
    class Login(Base):
    
        def login(self, username, password):
            """登录"""
            user = ('name', 'loginName')
            self.send(user, username)
            pwd = ('name', 'loginPassWord')
            self.send(pwd, password)
            submit = ('id', 'loginBtn')
            self.click(submit)
            time.sleep(2)
            content = ('id', 'title')
            res = self.find(content).text
            print('已成功登录', res)
    
    
    if __name__ == '__main__':
        driver = webdriver.Chrome()
        url = ""
        driver.get(url)

    4、adduser.py  文件  登录后添加用户的业务代码

    # -*- coding=utf-8 -*-
    from selenium import webdriver
    import time
    from common.base import Base
    import time
    
    
    class AddUser(Base):
    
        def add_user(self, user, phone, password, repassword):
            """登录后添加用户"""
            yonghu = ('id', 'uname')
            self.send(yonghu, user)
            shouji = ('id', 'uphone')
            self.send(shouji, phone)
            mima = ('id', 'password')
            self.send(mima, password)
            remima = ('id', 'password2')
            self.send(remima, repassword)
            time.sleep(1)
            button = ('id', 'savebtn2')
            self.click(button)
    
    
    if __name__ == '__main__':
        driver = webdriver.Chrome()
        url = ""
        driver.get(url)

    5、conftest.py  文件

    # -*- coding=utf-8 -*-
    import pytest
    from selenium import webdriver
    from page.login import Login
    import time
    
    
    @pytest.fixture(scope='session')
    def driver():
        global _driver
        print('------------open browser------------')
        _driver = webdriver.Chrome()
        _driver.maximize_window()
        _driver.implicitly_wait(10)
        yield _driver
        print('------------close browser------------')
        _driver.quit()
    
    
    @pytest.fixture(scope='session')
    def login(driver):
        """登录"""
        url = "登录的url地址"
        driver.get(url)
        time.sleep(5)
        login_system = Login(driver)
        login_system.login("13166666666", "666666")
        yield
        driver.delete_all_cookies()

    6、测试用例文件:test_user_one.py、test_user_two.py ,两个文件内容一样,只是模拟两个用例。

    import pytest
    from page.adduser import AddUser
    
    
    class TestOne(object):
    
        def test_01(self, login, driver):
            url = "新增用户页面的url地址"
            driver.get(url)
            user = AddUser(driver)
            user.add_user('test', '13122222224', '666666', '666666')
    
    
    if __name__ == '__main__':
        pytest.main(["-s", "test_user_one.py"])

     

    三、运行测试用例

    1、进入项目根目录

    2、输入命令:

    pytest case  (运行多个测试用例)

    pytest  case/test_user_one.py (运行单个用例)

     

    -s : 显示打印信息

     四、生成allure测试报告

    1、安装allure

    下载allure 最新版:https://github.com/allure-framework/allure2/releases

    将下载后的压缩包解压至本地(比如解压至D盘)

     

    把bin目录添加到环境变量path下

     2、安装 allure-pytest

    pip install allure-pytest

    3、运行用例

    (1)打开cmd命令

    (2)进入到项目根目录

    (3)执行命令

    pytest --alluredir ./report/allure_raw

     执行命令完成后,在report文件下中可以看到生成了一个allure_raw的原始文件,不能打开成html的报告。

     打开html的报告需要启动allure服务,启动命令如下

    allure serve report/allure_raw

    启动服务后会自动分配端口并打开浏览器

     五、查看测试报告

     

    以上就是所有内容了,快来试试吧~

    过程中报错解决:

    运行生成报告命令时报如下错误:是因为安装的pytest版本不兼容,提示推荐使用pytest 4.5.0 。

     卸载 pytest 其他版本,如5.3.2

    pip uninstall pytest==5.3.2

    安装 pytest 4.5.0

    pip install pytest==4.5.0

    最后附 allure 生成测试报告参考资料:https://www.cnblogs.com/yoyoketang/p/12004145.html

  • 相关阅读:
    『ORACLE』 DBLINK(11g)
    『ORACLE』 对永久表空间进行DDL操作(11g)
    『ORACLE』 对永久表空间进行DML操作(11g)
    『ORACLE』 数据库suspend模式(11g)
    『ORACLE』 数据库quiesce模式(11g)
    『ORACLE』 数据库restricted模式(11g)
    [转]为什么不去读顶级会议上的论文
    learn from 德国老师
    IDA 调试 Android
    L#中 int.TryParse 有问题
  • 原文地址:https://www.cnblogs.com/yudx/p/12126455.html
Copyright © 2011-2022 走看看