不是提示了吗? self.url+path 中 一个是 Nonetype 类型一个是 string 类型 不是 用 + 链接
但是其他的接口也是用这样的形式都正常,只有这个接口会报这个错误
打印看下你的 url 和 path ,看是不是没获取到
去看看 self.url 为啥是 None
self.url 是个 None,path 是个 str,那自然无法用 + 操作符链接。
问题原因:self.url 为空,根本就没有初始化,代码 bug
这种一般建议打断点 debug 看下整个流程中变量,对象的变化哦
建议放弃学习 真的!!!
把你这个文件的完整代码贴上来吧?
只有一个个截图片段没法评估问题。现在线索已经明确了 self.url 是 none 了,你需要做的是获取尽可能多的线索去定位为何值是 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()
看了完整代码,大概能猜到原因了:
你的 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 内重新写一遍