zoukankan      html  css  js  c++  java
  • 35 web自动化 pytest框架详述

    目录

    1.编写测试用例 web_cases.xlsx

    2.框架搭建

    3.自动化用例实现

    4.用例筛选

    一、流程

    首先,在实战之前,回顾好selenium的基础知识。77节

    只要是没有现成封装的方法可以使用,都可以通过发送JS代码的方式进行操作。

    1.编写测试用例 web_cases.xlsx

    2.框架搭建

        须知:在接口自动化测试中,已经有现成的框架,可以直接拿来用。

       ①common  通用模块,不以项目为转移的

      可以直接将common目录直接拷贝到web自动化框架中来,(可以用,不代表一定要用,比如其中,MySQL_hanlder、request_handler不需要,web自动化中,不需要这2方面的操作,需要用的时候,可以直接复制过来用)

       ②config 配置文件

      可以直接拷贝模块,但是内容需要根据项目情况进行修改(比如,路径、logger不需要修改,   修改账号)

       ③data、libs、logs、middware、reports、testcases、run.py同理

    框架的搭建,基本上跟接口的框架类似

    3.自动化用例实现(web自动化测试中,登录成功、登录错误的步骤是不一样的,要分开写)

    编写测试用例脚本,根据web_testcases.xlsx文件进行编写。

    举例:登录失败用例

     步骤如下:

    1.打开浏览器
    2.访问登录页面
    3.元素定位+元素操作,输入用户名和密码,点击登录
    4.通过获取页面内容得到实际结果,进行断言

    根据上述步骤,编写web自动化测试脚本(需要登录的web页面如下)

     手机号为空时,显示显示“请输入手机号”,作为断言

     

    代码实现test_login.py:

    """登录功能的测试用例"""
    
    import unittest
    from middware.handler import HandlerMiddle
    from config.config import Wait_time
    
    class TestLogin(unittest.TestCase):
        """登录功能的测试类"""
    
        def test_login_error(self):
            """测试步骤
            1.打开浏览器
            2.访问登录页面
            3.元素定位+元素操作,输入用户名和密码,点击登录
            4.通过获取页面内容得到实际结果,进行断言
            :return:
            """
    
            from selenium import webdriver
    
            #1.打开浏览器
            driver = webdriver.Chrome()
            #设置隐性等待 等待的时间就可以放在config中,直接参数调用
            ##方法一:放在yaml中
            wait_time = HandlerMiddle.yaml_data["selenium"]["wait_time"]
            ##方法二、放在config.py中
            #wait_time = Wait_time
            driver.implicitly_wait(wait_time)
    
            #2.访问登录页面
            url = "http://120.78.128.25:8765/Index/login.html"
            driver.get(url)
    
            #3.元素定位+元素操作,输入用户名和密码,点击登录
            driver.find_element_by_name("phone").send_keys("") #定位输入手机号为空
            driver.find_element_by_name("password").send_keys("")#定位输入的密码为空
            driver.find_element_by_class_name("btn-special").click()
    
            #4.通过获取页面内容得到实际结果,进行断言
            #实际结果是在页面上的提示,再次进行定位
            actual_result = driver.find_element_by_class_name("form-error-info").text
    
            #断言
            self.assertTrue(actual_result == "请输入手机号")

    上面代码实际结果中的text,是webelement对象直接调用的webelement.py文件中的text属性。

    源码如下:

    @property
    def text(self):
    """The text of the element."""
      return self._execute(Command.GET_ELEMENT_TEXT)['value']
    Command.GET_ELEMENT_TEXT,是Command类调用的类属性(GET_ELEMENT_TEXT = "getElementText")

    总结:自动化用例,是selenium基础操作的组合,根据用例设置,操作浏览器和页面。

    78节

    上面是异常用例的自动化实现,下面进行正常用例的实现。

    一般情况下:步骤不同,写不同的测试用例的函数(根据cases.xlsx测试用例的步骤编写)。

    正常用例,以登录来说,登录成功,会跳转到登录成功的页面。与异常用例不同的是,获取实际结果跟断言

    首先看下登录成功后,定位“我的账户”,通过Xpath进行定位查找,//a[@href="/Member/index.html"]

    代码实现:

    下面的断言,账户信息,用包含关系in:写关键字或者全称都OK,(用 ==的话,要注意查看actual_result是否与预期结果一致,这里是预期结果是写死的,后面再参数化)

        def test_login_success(self):
            """登录成功测试用例
            1.打开浏览器
            2.访问登录页面
            3.元素定位+元素操作,输入用户名和密码,点击登录
            4.通过获取页面内容得到实际结果,进行断言
            :return:
            """
            from selenium import webdriver
            #1.打开浏览器
            driver = webdriver.Chrome()
    
            #设置隐性等待时间
            wait_time  = HandlerMiddle.yaml_data["selenium"]["wait_time"]
            driver.implicitly_wait(wait_time)
    
            #2.访问登录页面
            url="http://120.78.128.25:8765/Index/login.html"
            driver.get(url)
    
            #3.元素定位+元素操作,输入用户名和密码,点击登录
            driver.find_element_by_name("phone").send_keys("159********")
            driver.find_element_by_name("password").send_keys("15******")
            driver.find_element_by_class_name("btn-special").click()
    
            #4.获取实际结果,进行断言
            actual_result = driver.find_element_by_xpath("//a[@href='/Member/index.html']").text
            print(type(actual_result))
            self.assertTrue("我的帐户[小蜜蜂177872141]" in actual_result)

    4.用例筛选   ---引入pytest

    背景:为什么进行用例筛选?

    虽然实现了异常用例,但是用的比较少,因为在web自动化测试中,大多数情况下都是正向测试,主流程测试、回归测试、冒烟测试;跑主流程,比如登录成功。

    所以在编写web自动化测试用例的时候,可以将用例全部编写,但是测试的时候,要进行用例筛选,只跑成功的用例。

    unittest框架:将成功的用例,手动一个个添加到测试集testsuite中:suite.addTests(),比较麻烦    (接口自动化中用的是discover,自动发现全部的测试用例,这里就无法实现筛选了,所以web不能用discover)

    下面引入pytest 框架

    安装pytest: pip install pytest 

    pytest在web自动化方面更加智能,筛选用例方便 ------(pytest可以用于api,web,app自动化)

    语法:(项目路径下新建个pytest.ini文件,注册标签名)

    1.在筛选的方法(用例)上,加“标签”:@pytest.mark.标签名

    2.终端项目路径下运行:pytest -m "标签名"

    下面运行登录成功的用例结果:一共3个用例,只收集了成功的2个用例。

     运行结果后谜案,有warning,打的mark标签,pytest无法识别,并给出细节查看链接,

     点击链接查看:需要在pytest.ini文件中,把标签添加上去,就不会有warning信息了。

     在项目路径下新建一个普通文件,命名为pytest.ini,将markers提前编写好,就不会出warning了

    扩展:pytest.ini文件

    pytest.ini文件是pytest的主配置文件,可以改变pytest的运行方式,它是一个固定的文件,pytest.ini文件读取配置信息,按指定的方式去运行。

    pytest.ini的位置:一般放在项目工程的根目录(即当前项目的顶级文件夹下)

    总结:标记功能的步骤

    ①先注册:在ini文件中,先注册mark的 名字

    ②打标签:测试用例函数上面@property.mark.标签名

    ③运行指定的标签用例:pytest -m "标签名"

    pytest模块规则:

    ①自动智能发现用例:模块名以test开头、结尾(否则不会当做是测试用例)-----发现用例规则

    ②测试类,不能有__init__(self)初始化的方法-----测试用例的类不需要初始化

    ③方法(函数),必须以test_开头,类必须时Test

    ④pytest测试用例函数可以脱离类,可以直接使用函数的形式(测试用例的py文件直接写为函数)------unittest中无此用法

    ⑤类可以不继承unittest.TestSuite

    (修改规则,78节50min),了解规则可以修改即可

    总结:pytest的优点

    ①灵活的筛选用例

    ②不需要手动加载用例(不需要导入加载器,运行器),不需要手动添加,手动运行,直接一行运行代码即可。

     ③pytest可以兼容unit test(unit test不能兼容pytest)

    执行测试:

    1.可以在pycharm中直接右键,以pytest方式运行,但是这个pycharm解释器的特有功能,不建议使用。可以在pycharm的终端中运行

        -----如果的别人需要运行自己的自动化代码,拷贝代码到本机,可以直接在terminal中,cd到该项目的根目录下,运行

    2.运行 pytest  testcase -sv    表示运行testcase目录下的所有的测试用例

       ---- 加上testcase目录,比较安全,万一别的目录中的函数有test_开头,会被pytest检测到当作用例执行了

       ----  -s 可以把用例中的print信息显示出来

       ---- -v 显示详细的测试结果在terminal    (可以组合表示为-sv)

       ---- 生成测试报告  --html=report.html --self-contained-html      (其中,如果不加--self-contained-html  ,会自动生成一个目录,不需要该目录就加上该这cmd)

  • 相关阅读:
    css3很美的蟠桃动画
    EXCEL countif函数多条件
    R语言介绍
    【转】Docker:Docker Compose 详解
    【转】Linux基础命令-curl
    【转】进入正在运行的Docker容器的4种方式
    【转】yum和apt-get的区别
    【转】laravel框架中 session保存到Redis中
    【转】Laravel 控制器 Controller 传值到 视图 View 的几种方法总结
    【转】Laravel中使用门面模式(Facade)
  • 原文地址:https://www.cnblogs.com/ananmy/p/13530524.html
Copyright © 2011-2022 走看看