python 3 인터페이스 자동화 테스트 프레임 워 크: python 3 + requests + 데이터 구동 (json)

22840 단어
인터페이스 테스트 는 유닛 테스트 의 키 집합 이지 만 유닛 테스트 와 같 지 않다.테스트 의 측면 에서 볼 때 인터페이스 테스트 의 가 치 는 테스트 투입 이 유닛 테스트 보다 적 고 기술 난이도 도 유닛 테스트 보다 적다 는 것 이다.일반적으로 인터페이스 테스트 의 입 도 는 단원 테스트 보다 더 굵 고 주로 서브 시스템 이나 서브 모듈 을 바탕 으로 하 는 인터페이스 차원 의 테스트 이다.따라서 인터페이스 테스트 에 필요 한 인터페이스 나 함수 의 수량 은 유닛 테스트 보다 훨씬 적 고 인터페이스 정의 안정성 은 클래스 급 함수 보다 훨씬 높다.따라서 인터페이스 테스트 사례 코드 의 변 동량 도 유닛 테스트 보다 훨씬 적 고 코드 유지 비용 은 유닛 테스트 보다 훨씬 적 기 때문에 테스트 의 투 자 량 이 매우 적다.다른 측면 에서 볼 때 인터페이스 테스트 를 통 해 서브 시스템 이나 서브 모듈 이 각종 응용 장면 에서 인터페이스 호출 의 정확성 을 확보 할 수 있다. 그러면 서브 시스템 이나 서브 모듈 의 제품 품질 도 충분히 보장 할 수 있다.따라서 인터페이스 테스트 는 적당 한 화이트 박스 테스트 기술 로 정확하게 말 하면 회색 박스 테스트 이 고 투입 생산 이 매우 이상 적 이다.전체적으로 보면 인터페이스 테스트 는 복잡성 이 높 은 시스템 품질의 내재 적 요구 와 낮은 원가 의 경제 이익 을 확보 하 는 구동 작용 에서 가장 좋 은 해결 방안 이다.주로 다음 과 같은 두 가지 측면 에 나타난다. 첫째, 인터페이스 테스트 는 테스트 원 가 를 절약 했다.그 다음으로 인터페이스 테스트 는 전통 적 으로 개 발 된 유닛 테스트 와 달리 인터페이스 테스트 는 사용자 의 측면 에서 시스템 인터페이스 에 대해 전면적 이 고 효율 적 이 며 지속 적 인 검 측 을 하 는 것 이다.
(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

좋은 웹페이지 즐겨찾기