问答 有没有大佬帮忙看看怎么解决啊,谢谢了

wxl0431 · 2021年11月23日 · 最后由 wxl0431 回复于 2021年11月24日 · 3298 次阅读

共收到 22 条回复 时间 点赞
wxl0431 回复

把你这个文件的完整代码贴上来吧?

只有一个个截图片段没法评估问题。现在线索已经明确了 self.url 是 none 了,你需要做的是获取尽可能多的线索去定位为何值是 none ,包括断点调试等手段。而不是一直盯着一样写法别的地方没问题这个事情,并持续截图去证明写法是可以跑通的。

建议放弃学习 真的!!!

不是提示了吗? self.url+path 中 一个是 Nonetype 类型一个是 string 类型 不是 用 + 链接

但是其他的接口也是用这样的形式都正常,只有这个接口会报这个错误

打印看下你的 url 和 path ,看是不是没获取到

那不是同一个类型的用什么连接

Jerry li 回复

确实打印不出来

Jerry li 回复

去看看 self.url 为啥是 None

剪烛 回复

确实是 None,但是我前面的 self.url 都是正常的

self.url 是个 None,path 是个 str,那自然无法用 + 操作符链接。

问题原因:self.url 为空,根本就没有初始化,代码 bug

王稀饭 回复

但是我其他几条 case 也都是用的 self.url ,都可以正常

开普敦人 回复

遇到问题还是要处理的

这种一般建议打断点 debug 看下整个流程中变量,对象的变化哦

无迹 回复

self.url 是全局变量,不知道突然后面为什么都变成 None

陈恒捷 回复
import time
import unittest


from common.common import *
import yaml
from ddt import ddt,file_data,data,unpack


#此测试用例主要验证登录接口以及进入系统后获取的一些初始化接口数据


@ddt
class MyTestCase(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        cls.baseapi = CommonApi()
        cls.token = None
        cls.userCode = None
        cls.url = None
        cls.headers = ''

    @classmethod
    def tearDownClass(cls):
        pass

    #客户端登录
    @file_data('../data/user.yaml')
    def test1_login(self,**kwargs):
        path = '/api/uc/public/v2new/account/login'
        url = kwargs.get('url')
        data = kwargs.get('data')
        headers = kwargs.get('headers')
        loginresult = self.baseapi.post(url=url+path,data=data,headers=headers)
        MyTestCase.token = loginresult.json()['data']['token']
        MyTestCase.userCode = loginresult.json()['data']['userCode']
        MyTestCase.url = url
        headers['Authorization'] = self.token
        MyTestCase.headers = headers
        self.assertEqual(loginresult.json()['msg'],'操作成功','登录失败')

    #查询某机构下员工详细列表
    def test2_friendUserInfo(self):
        path = '/api/user/v1/friendUserInfo/queryAppEmployeeDetailInfoList'
        data = {
            "employeeCodeList": []
        }
        friendUserInforesult = self.baseapi.post(url=self.url+path,data=data,headers=self.headers)
        self.assertEqual(friendUserInforesult.json()['msg'],'操作成功','获取好友信息列表失败')
        MyTestCase.url = self.url

    #查看员工个人信息/好友关系
    def test3_getUserInfo(self):
        path = '/api/uc/org/employee/v1/getEmpPerAndFriUserInfoNotPermission'
        data ={
            'employeeCode': self.userCode
        }
        getUserInforesult = self.baseapi.post(url=self.url+path,data=data,headers=self.headers)
        self.assertEqual(getUserInforesult.json()['msg'],'操作成功','获取个人信息失败')

    #登录IM
    def test4_imlogin(self):
        path = '/api/work-im/public/v1/app/login/'
        data = {
            "platform": 1,
            "code": "66666",
            "clientId": "55ED93CB-0DE2-46CA-896C-4FF9055C0956",
             "userCode": self.userCode
        }
        imloginresult = self.baseapi.post(url=self.url+path,data=data,headers=self.headers)
        self.assertEqual(imloginresult.json()['msg'],'操作成功','登录IM成功')

    #获取群聊
    @unittest.skip('暂时无法执行,先跳过')
    def test5_groupByUser(self):
        path = '/api/work/im/v1/app/group/groupByUser/'
        params = ''
        groupByUserresult = self.baseapi.get(url=self.url+path+self.userCode,params=params,headers=self.headers)
        print(groupByUserresult.json())

    #查询我的好友列表
    def test6_friendRequest(self):
        path = '/api/user/v1/friendRequest/queryAllFriend'
        data = {
            "pageSize": 10000,
            "pageNo": 1,
            "contactCode": self.userCode
        }
        friendRequestresult = self.baseapi.post(url=self.url+path,data=data,headers=self.headers)
        self.assertEqual(friendRequestresult.json()['msg'],'操作成功','获取好友数据失败')

    #查询某机构下员工详细列表带用户ID
    def test7_friendUserInfo(self):
        path = '/api/user/v1/friendUserInfo/queryAppEmployeeDetailInfoList'
        data = {
            "employeeCodeList": [self.userCode]
        }
        friendUserInforesult = self.baseapi.post(url=self.url+path,data=data,headers=self.headers)
        self.assertEqual(friendUserInforesult.json()['msg'],'操作成功','获取信息失败')

    #获取代办任务
    def test8_doinglist(self):
        path = '/api/workflowweb/approve/v1/doing/list'
        data = {
            "pageNum": 1,
            "pageSize": 5,
            "processDefinitionKeys": None
        }
        doinglistresult = self.baseapi.post(url=self.url+path,data=data,headers=self.headers)
        self.assertEqual(doinglistresult.json()['msg'],'操作成功','获取代办任务失败')

    #获取我发起的任务
    def test9_initiatorlist(self):
        path = '/api/workflowweb/approve/v1/initiator/list'
        data = {
            "pageNum": 1,
            "pageSize": 5,
            "instStatus": "approval",
            "processDefinitionKeys": None
        }
        initiatorlistresult = self.baseapi.post(url=self.url+path,data=data,headers=self.headers)
        self.assertEqual(initiatorlistresult.json()['msg'],'操作成功','获取我发起的任务失败')

    # #查询考勤信息
    def test_10_getonemain(self):
        path = '/api/oa/v1/myattendance/getonemain'
        timenow = time.strftime('%Y-%m', time.localtime(time.time()))
        data = {
            "whichMonth": timenow
        }
        # headers = {
        #     'Host': 'workpre.vvtechnology.cn',
        #     'Content-Type': 'application/json;charset=utf-8',
        #     'Accept': 'application/json,text/plain,*/*',
        #     'User-Agent': 'VV%20Work/3097CFNetwork/1197Darwin/20.0.0',
        #     'Connection': 'keep-alive',
        #     'uc': self.userCode,
        #     'Accept-Language': 'zh-cn',
        #     'Authorization': self.token,
        #     'Content-Length': '24',
        #     'Accept-Encoding': 'gzip,deflate,br'
        # }
        getonemainresult = self.baseapi.post(url=self.url+path,data=data,headers=self.headers)
        self.assertEqual(getonemainresult.json()['msg'],'操作成功','查询考勤失败')


    #薪资单待办消息
    @unittest.skip('接口不通,暂时跳过')
    def test11_unConfirm(self):
        path = '/api/finance/salary/v1/app/unConfirm'
        params = ""
        headers = {
            'Host': 'workpre.vvtechnology.cn',
            'uc': self.userCode,
            'Connection': 'keep-alive',
            'Accept': 'application/json,text/plain,*/*',
            'User-Agent': 'VV%20Work\/3097CFNetwork/1197Darwin/20.0.0',
            'Authorization': self.token,
            'Accept-Language': 'zh-cn',
            'Accept-Encoding': 'gzip,deflate,br'
        }
        unconfirmresult = self.baseapi.get(url=self.url+path,params=params,headers=self.headers)
        print(unconfirmresult.text)




















if __name__ == '__main__':
    unittest.main()

wxl0431 回复

看了完整代码,大概能猜到原因了:

你的 url 实际上是在 test1_login 这个测试方法里赋值的,而 unittest 是不会保证所有测试方法都是在这个方法后执行的,所以如果刚好有别的测试方法在 test1_login 前执行的,那它拿到的就是初始值 None ,而非赋值后的正确值。

另外,不知道你这段代码怎么来的,MyTestCase.url = url 这种赋值方式看,MyTestCase 像是个静态类,但你实际调用又用了 self.url 这种动态类获取属性值的方法,有点乱。

陈恒捷 回复

明白了,我自己再重新修改修改看看,谢谢啦,如果改不了再过来请教😅

20 楼正解。

楼主这个写法就是不正确的,url 它如果是全局变量就应该在 setUp 里面完成初始化,你这样的实现,每个测试用例之间就不再是独立的,其他用例都要耦合 test1_login 中对 url 变量的赋值,受到它的影响。

另外,你原本报错的那个 TestCase,留意到函数名写成了test_10_getonemain,test 后面带了个下划线,命名规范跟之前的所有测试用例不一致。网上搜索说 python unittest 是按照 TestCaseName 的命名 ASCII 来排序的,所以这一点也会影响实际的运行顺序。最好的规范就是,所以需要统一命名格式,不要人为设定 TestCase 的运行先后顺序,它们之间应该是独立的,如果耦合,那就应该拆分成多个 TestCase ,或者在单个 TestCase 内重新写一遍

王稀饭 回复

嗯,谢谢了,受教了

wxl0431 关闭了讨论 11月25日 09:43
19楼 已删除
王稀饭 回复

你看我这几条也都正常执行

开普敦人 回复

你是真滴残忍 😀

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册