python 3 인터페이스 자동화 테스트 프레임 워 크: python 3 + requests + 데이터 구동 (json)
(ps: 이상 인터넷 검색 과 자신의 총 결 이 있 습 니 다)
자, 더 이상 말 하지 않 겠 습 니 다. 그 다음 에 우리 가 인 터 페 이 스 를 테스트 하 는 전체적인 사고방식 은 다음 과 같 습 니 다.
1. 인터페이스의 관련 데 이 터 를 json 파일 에 저장 합 니 다.
2. 저 희 는 이 json 파일 을 읽 어서 인터페이스의 관련 정 보 를 읽 습 니 다. 이 는 경로, 파라미터, 요청 방식, 비교 값 등 을 포함 합 니 다.
3. requests 를 기반 으로 요청 을 보 내 는 방법 을 패키지 합 니 다.
4. 장식 기 를 사용 하여 구체 적 인 테스트 를 한다.
1 {
2 "test_1_ip_api": {
3 "url": "http://httpbin.org/ip",
4 "assert": {
5 "origin":"183.16.188.172"
6 },
7 "method": "get",
8 "params": {
9 "a":"b"
10 },
11 "case": " httpbin ip "
12 }
13 }
이상 은 JSon 파일 의 형식 입 니 다. 이러한 데 이 터 는 하나의 사례 를 대표 합 니 다.
test_1_ip_api: 표지 라 고 할 수 있 습 니 다.
url: 인터페이스의 경로.
assert: 마지막 인터페이스의 비교 값.
method: 인터페이스 요청 방식.
params: 인자 요청.ps: 만약 요청 방식 이 post 라면 여 기 는 data 입 니 다.
case: 이 용례 의 이름, 즉 테스트 의 점 입 니 다.
(주: headers 를 추가 해 야 할 수도 있 습 니 다. 이 사용자 가 직접 추가 하면 됩 니 다. 하지만 뒤의 코드 는 조금 만 수정 하 십시오.)
당연히 파일 이 있 습 니 다. 그러면 우 리 는 이 데 이 터 를 읽 어야 합 니 다.다음 코드 참조.
class ReadCaseData(object):
def __init__(self,filename):
self.filename = filename
self.path = os.path.join(get_super_path(),'data',self.filename)
@property
def read_case_json(self) -> dict:
'''
json
:return:
'''
try:
my_json = open(self.path,encoding='utf-8')
json_data = json.load(my_json)
return json_data
except Exception as err:
print(str(err))
def get_case_content(self,first_key,second_key):
'''
json
'''
return self.read_case_json[first_key][second_key]
def get_assert_keys(self,first_key):
'''
assert keys
'''
return self.get_case_content(first_key,'assert').keys()
def get_assert_value(self,first_key,assert_key):
'''
assert
'''
return self.read_case_json[first_key]['assert'][assert_key]
def get_case_name(self,first_key):
'''
'''
return self.get_case_content(first_key,'case')
이상 은 json 파일 의 각종 데 이 터 를 읽 고 필요 에 따라 봉인 하 는 방법 입 니 다.(사고방식: 서로 다른 json 파일 데이터 에 따라 이 json 파일 에 해당 하 는 파일 이름 을 가 져 옵 니 다. 그러면 이 파일 이름 을 초기 화한 다음 에 이 파일 과 관련 된 데 이 터 를 읽 습 니 다.)
(주: 1. get super path () 는 루트 디 렉 터 리 를 가 져 오 는 방법 입 니 다.)
그러면 데 이 터 를 읽 었 습 니 다. 어떻게 활용 해 야 합 니까? 그러면 저 희 는 requests 를 빌려 써 야 합 니 다. (이 라 이브 러 리 는 말 할 필요 가 없 을 것 입 니 다. 이런 글 을 찾 고 있다 면 저 는 이 라 이브 러 리 를 알 고 있 을 것 입 니 다.)
def get_base_url():
if IniHelper('server.ini').get_value('server', 'select') == 'test':
return IniHelper('server.ini').get_value('server', 'test')
elif IniHelper('server.ini').get_value('server', 'select') == 'formal':
return IniHelper('server.ini').get_value('server', 'formal')
else:
raise AttributeError(" ! !")
class Myrequests(ReadCaseData):
def __init__(self, filename, case_name):
ReadCaseData.__init__(self, filename)
self.case_name = case_name
self.base_url = get_base_url()
def make_requests_template(self):
'''
json method, , get post
:return:
'''
if self.get_case_content(self.case_name, 'method').lower() == 'get':
body = {}
body['url'] = self.base_url + self.get_case_content(self.case_name, 'url')
body['params'] = self.get_case_content(self.case_name, 'params')
return self.get(**body)
elif self.get_case_content(self.case_name, 'method').lower() == 'post':
body = {}
body['url'] = self.base_url + self.get_case_content(self.case_name, 'url')
body['params'] = self.get_case_content(self.case_name, 'data')
return self.post(**body)
else:
raise AttributeError(" , , ['GET', 'POST']")
def get(self, **kw):
'''
requests get
:param kw:
:return:
'''
return requests.get(**kw)
def post(self, **kw):
'''
requests post
:param kw:
:return:
'''
return requests.post(**kw)
@property
def get_json(self):
'''
json
:return:
'''
try:
return self.make_requests_template().json()
except Exception as e:
print('json format error' + str(e))
@property
def get_status_code(self):
'''
status_code
:return:
'''
return self.make_requests_template().status_code
여 기 는 우선 우리 가 방금 봉 인 된 읽 은 제 이 슨 파일 의 종 류 를 계승 한 것 입 니 다. 계승 한 후에 그의 방법 을 사용 한 다음 에 안의 데 이 터 를 읽 어서 요청 을 보 낼 수 있 기 때 문 입 니 다.
주: 여기 있 는 인터페이스의 서버 주 소 는 프로필 을 읽 는 것 을 통 해 이 코드 는 공유 하지 않 습 니 다. 여러분, 인터넷 에서 찾 아 보 세 요. 많 습 니 다.(마음대로)
ps: 1, IniHelper 는 설정 파일 을 읽 는 클래스 입 니 다.
2. 이곳 은 get 과 post 만 봉인 되 어 있 습 니 다. 물론 다른 것 도 계속 추가 할 수 있 습 니 다 (예 를 들 어 put, delete 등!)
데이터 도 읽 었 고 요청 을 보 내 는 방법 도 봉인 되 었 습 니 다. 그럼 이 데 이 터 를 어떻게 테스트 해 야 합 니까?
def test_case_run(data_file_name, test_case_key):
def _test_case_run(func):
def wrap(self):
r = Myrequests(filename=data_file_name, case_name=test_case_key)
self.r = r
self._testMethodDoc = r.get_case_name(test_case_key)
self.status_code = r.get_status_code
self.json = r.get_json
self.assert_key = r.get_assert_keys(test_case_key)
log.get_log(test_case_key).info(f' :{test_case_key}')
log.get_log(test_case_key).info(' :status_code')
self.assertEqual(r.get_status_code, 200)
for key in r.get_assert_keys(test_case_key):
log.get_log(test_case_key).info(f' :{key}')
self.assertEqual(get_dict_value(key, **r.get_json), r.get_assert_value(test_case_key, key))
func(self)
return wrap
return _test_case_run
이상 은 읽 은 데이터 와 요청 을 보 내 는 방법 에 따라 봉 인 된 장식 기 입 니 다.
그 중:
log: 이것 은 logging 패 키 징 을 기반 으로 한 기록 log 의 클래스 입 니 다.
get_assert_value (): 이것 은 json 데이터 에서 읽 은 assert 데이터 의 Key 에 따라 실제 인터페이스 에서 되 돌아 오 는 value 를 얻 는 방법 입 니 다.
(주: 1. json 에 있 는 assert 의 데 이 터 는 적어도 하나, 여러 개 일 수 있 습 니 다. 2. Key 를 사용 하여 실제 결과 에서 value 를 가 져 올 때 다단 계 사전 일 수 있 으 므 로 이 방법 은 재 귀 를 사용 합 니 다)
마지막 으로 우 리 는 python 의 unittest 를 사용 하여 테스트 를 진행 했다.
from src.testcase.method.base_test import BaseTest
from src.testcase.method import wraps
import unittest
class TestApi(BaseTest):
@wraps.test_case_run('data.json', 'test_1_ip_api')
def test_01(self):
self._testMethodDoc = self._testMethodDoc
@wraps.test_case_run('data.json', 'test_2_headers_api')
def test_02(self):
self._testMethodDoc = self._testMethodDoc
@wraps.test_case_run('data.json', 'test_3_post_api')
def test_03(self):
self._testMethodDoc = self._testMethodDoc
if __name__ == '__main__':
unittest.main(verbosity=2)
이상 은 실제 구체 적 인 사례 입 니 다. 우 리 는 모든 케이스 에 장식 기 를 사용 한 다음 에 장식 기 는 두 개의 매개 변수 가 있 습 니 다. 여기 서 설명 하 겠 습 니 다. 1. 바로 이 케이스 에 대응 하 는 파일 이름 입 니 다.2. 바로 이 케이스 가 json 파일 에 대응 하 는 표지 입 니 다.
제안:
1. 모든 인 터 페 이 스 는 json 파일 에 대응 한 다음 에 이 json 파일 에 모든 case 에 표 지 를 추가 합 니 다.(글 속 의 제 이 슨 파일 은 인터페이스 에 대응 하 는 케이스 입 니 다.)
2. 모든 제 이 슨 파일 은 같은 폴 더 아래 에 놓 여 있 습 니 다.
3. 모든 인터페이스 가 테스트 파일 에 대응 합 니 다.
4. 결 과 는 마지막 으로 html testrunner 의 html 보고 출력 을 사용 합 니 다.
5. 보고 서 를 이메일 로 발송 합 니 다.
6. jenkins 를 사용 하여 서버 에 배치 합 니 다.
여러분 의 지 증 을 환영 합 니 다!!!
다음으로 전송:https://www.cnblogs.com/Alin-2016/p/8891471.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.