zoukankan      html  css  js  c++  java
  • 接口自动化使用global全局变量解决数据依赖问题

    今天在使用global全局变量解决数据依赖的问题时,睬了一个大坑。unittest框架执行顺序的问题,unittest默认加载脚本的顺序是:根据ASCII码的顺序加载,数字与字母的顺序为:0-9,A-Z,a-z。所以以A开头的测试用例方法会优先执行,以a开头会后执行。

    前面不知道这个规则,导致报错如下:

    AttributeError: 'NoneType' object has no attribute 'group'

    产生这个报错的原因是,我第二条用例需要用到登录的cookie,结果第二条用例却先执行,导致cookie传递为空。最后解决办法:调整运行顺序,改变一下用例名称,让登陆用例先执行。

    看下图先运行的第二条用例,所以打印的cookie为空:

    有下图代码可知:

    定义了一个全局变量,COOKIE=None,然后将登录的cookies进行了一个替换操作。即COOKIE=login_res.cookies。然后在下一条用例,获取我的精品页面信息的时候,将cookies=COOKIE传递到了http请求里面。从而解决了下一个请求依赖于上一个请求的返回值的问题。

    全部代码如下:

    import unittest
    from API_AUTO.tools.http_request import HttpRequest
    import re
    
    COOKIE = None
    
    
    class TestHttp(unittest.TestCase):
        def setUp(self):
            pass  # abcdefghijklmnopqrstuvwxyz
    
        def test_Normal_login(self):
            '''正常登录'''
            global COOKIE
            url = 'https://www.ketangpai.com/UserApi/login'
            data = {
                "email": "1489088761@qq.com",
                "password": "A156829",
                "remember": 0
            }
            headers = {
                "User-Agent": " Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36",
                "Content-Type": "application/x-www-form-urlencoded",
            }
            login_res = HttpRequest().http_request('post', url, data, headers)
            if login_res.cookies:
                COOKIE = login_res.cookies
                print(COOKIE)
            try:
                self.assertEqual(1, login_res.json()['status'], '登录失败')
            except AssertionError as e:
                print('登录错误{}'.format(e))
                raise e
    
    
    
        def test_mooc(self):
            '''我的精品页面'''
            global COOKIE
            # print(COOKIE)
            url1 = 'https://www.ketangpai.com/Mooc/Mooc/index.html'
            headers1 = {
                "Referer": "https: // www.ketangpai.com / Main / index.html",
                "User-Agent": " Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36",
    
            }
            print(COOKIE)
            res1 = HttpRequest().http_request('get', url=url1, headers=headers1, cookies=COOKIE)
            try:
                pattern = '<img class=.*?salt=(".*?").*?>'
                regular = re.search(pattern, res1.text, re.S)
                self.assertEqual('夏茂杰', eval(regular.group(1)), '进入我的界面失败')
            except Exception as e:
                print('错误是{}'.format(e))
                raise e
    
        def tearDown(self):
            pass
    
    
    if __name__ == '__main__':
        unittest.main()
    

      

  • 相关阅读:
    (转)Java 详解 JVM 工作原理和流程
    sql复杂查询语句总结
    公众平台服务号、订阅号、企业号的相关说明
    新公司注册流程
    认缴出资额和实缴出资额的区别
    ***iOS学习之Table View的简单使用和DEMO示例(共Plain普通+Grouped分组两种)
    APP后端处理视频的方案
    iOS应用程序生命周期(前后台切换,应用的各种状态)详解
    app后端搜索入门
    APP后端处理表情的一些技巧
  • 原文地址:https://www.cnblogs.com/xiamaojjie/p/12031265.html
Copyright © 2011-2022 走看看