我正在pytest中编写一些API测试,这些测试包含一个从实用程序类生成的user
对象。然后,它调用requests
库以进行所需的API调用。
下面是我的代码,用于测试/user
操作。
import requests
class users:
def __init__(self, user_with_token):
self.token = user_with_token["Token"]
self.url = 'http://127.0.0.1:5000/api/Users/'
self.headers = {'token': self.token}
def get_all_users(self):
return requests.get(self.url, headers=self.headers).status_code
def delete_user(self):
return requests.delete(self.url, headers=self.headers).text
def update_user(self):
return requests.post(self.url, headers=self.headers).text
以下是调用上述内容的测试:
import pytest
from endpoints.users import users
def get_all_users(user_with_token):
result = users.get_all_users(user_with_token)
assert result == 200
def test_delete_all_users(user_with_token):
result = users.delete_user(user_with_token)
assert "Current user deleted" in result
这里是生成虚假数据供测试使用的定义:
def generate_user_with_token():
fake = Faker()
url = 'http://127.0.0.1:5000/api/Register/'
username = fake.name().split(' ', 1)[0],
email = fake.email(),
password = fake.random_int(min=0, max=9999)
token = requests.post(url, json={'Username': username,'Email Address': email,'Password': password}).text.split()[-2]
user = {
"Username": username,
"Email Address": email,
"Password": password,
"Token": token
}
return user
但是,当我运行它时。我收到一条错误消息:
def delete_user(self):
> return requests.delete(self.url, headers=self.headers).text
E AttributeError: 'dict' object has no attribute 'url'
我无法使用self.url
吗?我不想在每个定义中都重新声明它,因为每个测试的端点都相同。
答案 0 :(得分:1)
您要在整个类而不是类的特定实例上调用delete_user
函数。同样,将类名大写也是更常见的,因此类名将是Users
而不是user
。要创建Users
类的实例,请执行users = Users(user_with_token)
。
当您使用delete_user
在类(而不是类的实例)上调用users.delete_user(user_with_token)
函数时,user_with_token
字典将作为self
参数传递错误的来源。当您改为在特定实例上调用该函数时,Python会自动使self
参数成为该实例。
使用该类时,您应该执行以下操作(此代码假设您将类从users
重命名为Users
btw:
from endpoints.users import users
def get_all_users(user_with_token):
users = Users(user_with_token)
result = users.get_all_users()
assert result == 200
def test_delete_all_users(user_with_token):
users = Users(user_with_token)
result = users.delete_user()
assert "Current user deleted" in result
请注意,该方法不是用users.delete_user(user_with_token)
而是用users.delete_user()
来调用,因为您的delete_user
方法只期望一个参数-self
,而不是两个({ {1}}和self
)。创建user_with_token
类的实例后,它将包含来自Users
的数据,因此无需将数据也传递给user_with_token
和delete_user
函数