• python unittest TestCase间共享数据(全局变量的使用)


    文章目录

    1.setupclass里设置self.xxx变量,不同用例之间无法实时共享参数变动

    2.setupclass里设置globals().["xxx"]变量,不同用例之间可以实时共享参数变动

    3.setupclass里设置 ClassName.XXX变量,不同用例之间可以实时共享参数变动

    4.setupclass之前设置 XXX变量

    1.setupclass里设置self.xxx变量,不同用例之间无法实时共享参数变动

    from settings import *
    import requests,json
    import unittest
    
    
    class Login(unittest.TestCase):
    
        @classmethod
        def setUpClass(self):
            api_token = '/v1/api/common/getToken'
            self.real_token_url = API_TEST_BASE_URL + api_token
            self.token = None
    
        def test_get_token(self):
            r = requests.post(url=self.real_token_url)
            self.token = json.loads(r.text)['model']['token']
            print("第一个case获得的token:",self.token)
            return self.token
    
        def test_get_u(self):
            print("第二个case获得token值:",self.token)
    
    
    if __name__ == '__main__':
        unittest.main()

    执行结果:

    第一个case获得的token: 48579630472b45a0b0b553bc85a335f8
    第二个case获得token值: None
    • 说明在unttest框架中,testcase中间不共享变量的值,但是都可以从setupclass里面读取统一的变量值
    • 可以setup时候设置全局变量,不同的case之间就可以共享这个变量了

    2.setupclass里设置globals().[“xxx”]变量,不同用例之间可以实时共享参数变动

    from settings import *
    import requests,json
    import unittest
    
    
    class Login(unittest.TestCase):
    
        @classmethod
        def setUpClass(self):
            api_token = '/v1/api/common/getToken'
            self.real_token_url = API_TEST_BASE_URL + api_token
            globals()["token"] = None
    
        def test_get_token(self):
            r = requests.post(url=self.real_token_url)
            globals()["token"] = json.loads(r.text)['model']['token']
            print("第一个case获得的token:",globals()["token"])
            return globals()["token"]
    
        def test_get_u(self):
            print("第二个case获得token值:",globals()["token"])
    
    if __name__ == '__main__':
        unittest.main()

    执行结果:

    第一个case获得的token: 44c5fcccca6c4e64a1c5d314b7ee22fc
    第二个case获得token值: 44c5fcccca6c4e64a1c5d314b7ee22fc

    3.setupclass里设置 ClassName.XXX变量,不同用例之间可以实时共享参数变动

    import unittest
    
    class Mydemo(unittest.TestCase):
    
        @classmethod
        def setUpClass(cls):
            Mydemo.a = "88"
    
        def test1(self):
            print("test1-----{}".format(Mydemo.a))
            Mydemo.a = "99"
    
        def test2(self):
            print("test2-----{}".format(self.a))
            print("test2_2---{}".format(Mydemo.a))
    
    
    if __name__ == '__main__':
        unittest.main()

    执行结果:

    test1-----88
    test2-----99
    test2_2---99

    我们运行test1的时候,给Mydemo.a可以获取全局变量的a,打印完之后又设置了新的值
    test2运行的时候,通过2中方式,都能获取到了全局变量的值。

    4.setupclass之前设置 XXX变量

    class AlienTest(unittest.TestCase):
        status = 200
    
        @classmethod
        def setUpClass(cls):
            cls.url = "http://www.baidu.com"
            globals()['status'] = 300
    
        def test_1_alien(self):
            print("test_1_status:", self.status)
    
        def test_2_alien(self):
            self.status = 404
            print("test_2_status", self.status)
    
        def test_4_alien(self):
            print("test_4_global_status", globals()['status'])
            print("test_4_status", self.status)
    
    
    if __name__ == '__main__':
        unittest.main()
    test_1_status: 200
    test_2_status 404
    test_4_global_status 300
    test_4_status 200

    我自己在写接口自动化中遇到这样的问题,testcase中有一个变量的值是我想要的,这个值是shopid(我这个接口是新增店铺,新增成功之后会返回一个shopid)

    ,那么在

    tearDownClass里面我就想要去删除他,所有需要获取到testcase中的shopid

    db =  config.db
    class Login(unittest.TestCase):
        @classmethod
        def setUpClass(cls):
            cls.db  =  config.db
            cls.cursor = db.cursor(cursor = cursors.DictCursor)
            print("连接数据库成功!
    ")
    
    
        @classmethod
        def tearDownClass(cls):
            print("cls.shop_id:"+str(Login.shop_id))
            deleteRecord(cls.db,cls.cursor,"t_shop_info","id",int(Login.shop_id))
            cls.cursor.close()
            cls.db.close()
            print("关闭数据库成功!
    ")
    
    
        @parameterized.expand(ReadParameterized(path,"shop",api_name+".json").read_params())
        def test_shop_login(self,case_number):
            try:
                param = PostParameter().post_param(path,"shop",api_name+".json",case_number)
    
                r = Api_AddShop().add_shop(param["url"],param["headers"],param["common_param"],param["data"],param["expect_results"])
    
                self.assertEqual(param["expect_results"]["code"],r["code"])
                self.assertEqual(param["expect_results"]["msg"], r["msg"])
                # 定义全局变量 shop_id
                Login.shop_id = str(r["data"]["shop_id"])
            except Exception as e:
                print("this except is "+str(e))
                # raise e
    
    if __name__ == '__main__':
        unittest.main()

    引用文章来源:
    https://blog.csdn.net/happyteafriends/article/details/22728749
    https://www.cnblogs.com/hhudaqiang/p/6596043.html

    文章转自:https://blog.csdn.net/chenmozhe22/article/details/81302780?utm_source=blogxgwz6

  • 相关阅读:
    [WSUS] Windows Server Update Service 更新后,出现错误不能连接
    [SQLServer] 数据库SA用户被锁定或者忘记密码的恢复
    [SQLServer] 内存占用查看
    [IIS] [PHP] 500.19 随机出现
    [OPENSSL下载][证书] OPENSSL将PFX证书转换为PEM格式
    [VS2015] [asp.net] 允许远程访问本机正在DEBUG的服务
    [VS2008] 安装 AnkhSVN 后,选项中选择它,Pending Changes 窗口一闪而过,源代码管理工具自动跳回 【None】
    [IIS] 配置PHP的过程与坑
    10分钟快速入门vue.js
    前端接口请求的几种方式
  • 原文地址:https://www.cnblogs.com/wangxiaoqun/p/12366937.html
Copyright © 2020-2023  润新知