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 ```