Funcion Version
```python=
user_data=[root,group,user]
@pytest.mark.parametrize("get_token",user_data, indirect=True)
def test_get_all_group(get_token,url_group):
auth=get_token
headers = {
"Content-Type": "application/json",
"Authorization":'Bearer '+ auth
}
data={}
url =url_group
res = requests.get(url=url, headers=headers,json=data).status_code
#print("\n\ntest get all group: \n")
assert res== 200
user_data=[group,user]
d=["/1","/1000"]
@pytest.mark.parametrize("a",d)
@pytest.mark.parametrize("get_token",user_data, indirect=True)
def test_get_group_no_auth(get_token,url_group,a): #user和group對合法格式並無權限的group回傳403
auth=get_token
headers = {
"Content-Type": "application/json",
"Authorization":'Bearer '+ auth
}
l=a
url =url_group+a
res = requests.get(url=url, headers=headers).status_code
assert res == 403
```
Ivy Yaml Version
```python=
import pytest
import requests
import json
import yaml
from fixture import *
import fixture
lista=[]
with open('post_auth.yaml', encoding='UTF-8')as f:
data = yaml.load(f, Loader=yaml.FullLoader)
for i in range(len(data['testcase'])):
lista.append(data['testcase'][i])
@pytest.mark.parametrize("a",lista)
def test_2_post_group(a,url_auth):
case_id=a['id']
descript=a['descript']
role_id=a['role_id']
url=a['url']
method=a['method']
data=a['json']
status=a['status']
if data['email']=='root':
data['email']=conf.test_root['email']
data['password']=conf.test_root['password']
elif data['email']=='SE':
data['email']=conf.test_SE['email']
data['password']=conf.test_SE['password']
elif data['email']=='group':
data['email']=conf.test_group['email']
data['password']=conf.test_group['password']
elif data['email']=='user':
data['email']=conf.test_user['email']
data['password']=conf.test_user['password']
#get token
headers = {"Content-Type": "application/json;charset=utf8"}
sign_data = {
"email": data["email"],#"InternshipRoot@openfind.com.tw",
"password": data["password"],
"type": "base"
}
res = requests.post(url=url_auth, headers=headers, json=sign_data)
assert res.status_code== status
```
```yaml=
testcase:
-
id: 0
descript: wrong token
role_id:
url: /auth/whoami
method: get
json:
token: '123'
status: 401
-
id: 1
descript: right token
role_id:
url: /auth/whoami
method: get
json:
token: root_tk
status: 401
```
conftest.py
```python=
import requests
import pytest
import os
import json
from dotenv import load_dotenv
load_dotenv()
rt_account = os.getenv('rt_account')
gp_account = os.getenv('gp_account')
ur_account = os.getenv('ur_account')
Url = os.getenv("Url")
def Auth(account):
login = requests.request("POST", url = f'{Url}/auth/login', headers={"Content-Type": "application/json"}, data = account)
info = json.loads(login.text)["data"]
token = info["access_token"]
return token
@pytest.fixture(name = "Token", scope = "module")
def AllToken():
rt_token = Auth(rt_account)
gp_token = Auth(gp_account)
ur_token = Auth(ur_account)
return rt_token, gp_token, ur_token
```
test_api.py
```python=
import requests
import pytest
import yaml
import os
import json
from dotenv import load_dotenv
load_dotenv()
Url = os.getenv("Url")
with open("testcase.yml", "r", encoding="utf-8") as stream:
datas = yaml.load(stream, Loader=yaml.FullLoader)
def Auth(Token, str): #分辨需要的權限,回傳token
rt_token, gp_token, ur_token = Token
if str == "Root":
return rt_token
elif str == "Group":
return gp_token
elif str == "User":
return ur_token
def getid(msg, idlist): #獲取建立的資料的id
resg_json = msg.json()["data"]
for data in resg_json:
if 'id' in data:
idlist.append(data["id"])
def Setenv(Token, setups, idlist): #建立測試所需要的環境
for setup in setups:
resg = requests.request(setup["Method"], url = f'{Url}{setup["Url"]}', headers = {'Authorization':f'Bearer {Auth(Token, setup["Auth"])}'}
, json = setup["Json"] if "Json" in setup else {})
getid(resg, idlist)
def Delenv(Token, teardown, idlist): #刪除測試所建立的資料
for id in idlist:
resg = requests.request(teardown["Method"], url = f'{Url}{teardown["Url"]}/{id}', headers = {'Authorization':f'Bearer {Auth(Token, teardown["Auth"])}'}
, json = teardown["Json"] if "Json" in teardown else {})
def Get_user_data(Token, cases, idlist): #User GET (獲取指定或所有user資料)
for case in cases:
resg = requests.request(case["Method"], url = f'{Url}{case["Url"]}', headers = {'Authorization':f'Bearer {Auth(Token, case["Auth"])}'}
, json = case["Json"] if "Json" in case else {})
if resg.status_code != case["Status"]:
print(case["id"])
assert resg.status_code == case["Status"]
def Post_user_data(Token, cases, idlist): #User POST (建立user資料)
for case in cases:
resg = requests.request(case["Method"], url = f'{Url}{case["Url"]}', headers = {'Authorization':f'Bearer {Auth(Token, case["Auth"])}'}
, json = case["Json"] if "Json" in case else {})
if resg.status_code != case["Status"]:
print(case["id"])
if resg.status_code == 200:
getid(resg, idlist)
assert resg.status_code == case["Status"]
def Patch_Delete_user_data(Token, cases, idlist):
for case in cases:
resg = requests.request(case["Method"]
, url = f'{Url}{case["Url"]}/{idlist[case["itemorder"]]}' if "itemorder" in case else f'{Url}{case["Url"]}'
, headers = {'Authorization':f'Bearer {Auth(Token, case["Auth"])}'}
, json = case["Json"] if "Json" in case else {})
if resg.status_code != case["Status"]:
print(case["id"])
assert resg.status_code == case["Status"]
def Patch_user_password(Token, cases, idlist):
for case in cases:
resg = requests.request(case["Method"]
, url = f'{Url}{case["Url"]}/{idlist[case["itemorder"]]}/password' if "itemorder" in case else f'{Url}{case["Url"]}/password'
, headers = {'Authorization':f'Bearer {Auth(Token, case["Auth"])}'}
, json = case["Json"] if "Json" in case else {})
if resg.status_code != case["Status"]:
print(case["id"])
assert resg.status_code == case["Status"]
def test_func(Token): #主要的測試function
tests = datas["Test"]
for test in tests:
memo = test["Memo"]
setups = test["Setup"]
cases = test["Case"]
teardown = test["Teardown"]
idlist = [] #儲存測試時建立的資料,以便使用或刪除
try:
if setups != None: #建立
Setenv(Token, setups, idlist)
#test case
if memo == 'GET(/user)':
Get_user_data(Token, cases, idlist)
if memo == 'POST(/user)':
Post_user_data(Token, cases, idlist)
if memo == 'PATCH(/user/{id})' or memo == 'DELETE(/user/{id})':
Patch_Delete_user_data(Token, cases, idlist)
if memo == 'PATCH(/user/{id}/password)':
Patch_user_password(Token, cases, idlist)
if memo == 'GET(/task)':
Get_user_data(Token, cases, idlist)
finally:
if teardown != None: #刪除
Delenv(Token, teardown, idlist)
```
testcase.yml
```python=
Test:
-
Memo: 'PATCH(/user/{id}/password)'
Setup:
- Method: 'POST'
Url: /user
Auth: 'Root'
Status: 200
Json:
email: test_post_userg1@c1.soc.mailcloud.com.tw
password: openfind
name: test_post_userg1
role_id: 4
group_id: 1
Case:
- id: 53
descript: 以"root"身分執行,修改個人密碼(自己)
Method: 'PATCH'
Url: '/user/6'
Auth: 'Root'
Status: 200
Json:
password: 'openfind'
new_pwd: 'openfind'
- id: 54
descript: 以"group admin"身分執行,修改個人密碼(自己)
Method: 'PATCH'
Url: '/user/7'
Auth: 'Group'
Status: 200
Json:
password: 'openfind'
new_pwd: 'openfind'
Teardown:
Method: "DELETE"
Url: "/user"
Auth: "Root"
Status: 200
```