Pytest+request+Allure 인터페이스 자동화 프레임 워 크 실현

선언:
인터페이스 자동 화 는 아 날로 그 프로그램 인터페이스 차원 의 자동 화 를 말 하 는데 인터페이스 가 쉽게 변경 되 지 않 고 유지 보수 비용 이 더욱 적기 때문에 각 회사 의 사랑 을 받는다.
인터페이스 자동 화 는 두 부분,기능 적 인 인터페이스 자동화 테스트 와 병렬 인터페이스 자동화 테스트 를 포함한다.
이번 글 은 첫 번 째 기능 적 인 인터페이스 자동화 프레임 워 크 를 중점적으로 소개 한다.
간단 한 소개
환경:Mac,Python 3,Pytest,Allure,Request

pytest==3.6.0
pytest-allure-adaptor==1.7.10(  )
pytest-rerunfailures==5.0
configparser==3.5.0
PyYAML==3.12
requests==2.18.4
simplejson==3.16.0
----------------------------------------
2020-4-30  
pytest==5.3.1
allure-pytest==2.8.6
allure-python-commons==2.8.6
⚠️ :pytest-allure-adaptor   ,  allure-pytest;
  allure-pytest ,  pytest-allure-adaptor  
흐름:Yaml 테스트 데이터 읽 기-테스트 용례 생 성-테스트 용례 실행-Allure 보고서 생 성
모듈 류 의 디자인 설명:Request.py패키지 request 방법,다 중 프로 토 콜 확장 지원(get\post\put)
환경 별 설정,email 관련 설정 을 포함 하여 설정 파일 을 읽 습 니 다.Config.py패키지 기록 로그 방법 은 debug,info,warning,error,critical 로 나 뉜 다.Log.pysmtplib 패키지 방법,실행 결과 메 일 알림 보 내기Email.pyassert 패키지 방법Assert.py핵심 코드.사례 집합 을 정의 하고 실행 하여 보고 서 를 생 성 합 니 다.
Yaml 테스트 데이터 형식 은 다음 과 같 습 니 다.

---
Basic:
  dec: "    "
  parameters:
    -
      url: /settings/basic.json
      data: slug=da1677475c27
      header: {
                 "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko)\
                  Chrome/67.0.3396.99 Safari/537.36",
                 "Content-Type": "keep-alive"
              }
2.코드 구조 와 프레임 워 크 프로 세 스
1.코드 구 조 는 다음 그림 참조:

코드 구조.jpg
2.프레임 워 크 프로 세 스 는 다음 그림 참조:

프레임 워 크 프로 세 스.jpg
3.상세 한 기능 과 사용 설명
1.설정 파일 config.ini 정의
이 파일 에 서 는 테스트 환경[private 구분debug]와 공식 환경[onlinerelease]는 각각 관련 설정 항목 을 정의 합 니 다.[mail]부분 은 메 일 관련 설정 항목 입 니 다.

# http          
 
[private_debug]
# debug    
tester = your name
environment = debug
versionCode = your version
host = www.jianshu.com
loginHost = /Login
loginInfo = [email protected]&password=123456
 
[online_release]
# release    
tester = your name
environment = release
versionCode = v1.0
host = www.jianshu.com
loginHost = /Login
loginInfo = [email protected]&password=123456
 
[mail]
#      
smtpserver = smtp.163.com
sender = [email protected]
receiver = [email protected]
username = [email protected]
password = 123456
2,Yml 테스트 데 이 터 를 읽 고 봉인
Yml 테스트 데이터 예 는 첫 번 째 절 을 볼 수 있 습 니 다.하나의 인 터 페 이 스 는 여러 개의 case 데 이 터 를 정의 할 수 있 습 니 다.getparameter 는 봉 인 된 Yml 데 이 터 를 읽 는 방법 으로 반복 적 으로 읽 은 후 여러 개의 case 데 이 터 를 list 에 저장 합 니 다.

class Basic:
    params = get_parameter('Basic')
    url = []
    data = []
    header = []
    for i in range(0, len(params)):
        url.append(params[i]['url'])
        data.append(params[i]['data'])
        header.append(params[i]['header'])
3.사례 작성

class TestBasic:
    @allure.feature('Home')
    @allure.severity('blocker')
    @allure.story('Basic')
    def test_basic_01(self, action):
        """
                :            
        """
        conf = Config()
        data = Basic()
        test = Assert.Assertions()
        request = Request.Request(action)
 
        host = conf.host_debug
        req_url = 'http://' + host
        urls = data.url
        params = data.data
        headers = data.header
 
        api_url = req_url + urls[0]
        response = request.get_request(api_url, params[0], headers[0])
 
        assert test.assert_code(response['code'], 401)
        assert test.assert_body(response['body'], 'error', u'            .')
        assert test.assert_time(response['time_consuming'], 400)
        Consts.RESULT_LIST.append('True')
4.전체 프레임 워 크 run.py 실행

if __name__ == '__main__':
    #      
    args = ['-s', '-q', '--alluredir', xml_report_path]
    self_args = sys.argv[1:]
    pytest.main(args)
    cmd = 'allure generate %s -o %s' % (xml_report_path, html_report_path)
 
    try:
        shell.invoke(cmd)
    except:
        log.error('      ,       ')
        raise
 
    try:
        mail = Email.SendMail()
        mail.sendMail()
    except:
        log.error('      ,       ')
        raise
5.err.log 인 스 턴 스
[ERROR 2018-08-24 09:55:37]Response body != expected_msg, expected_msg is{"error":"계속 작업 하기 전에 등록 하거나 로그 인 하 십시오 9."},body is{"error":"계속 작업 하기 전에 등록 하거나 로그 인 하 십시오."}
[ERROR 2018-08-24 10:00:11]Response time > expected_time, expected_time is 400, time is 482.745
[ERROR 2018-08-25 21:49:41]statusCode error, expected_code is 208, statusCode is 200
6.Assert 부분 코드

    def assert_body(self, body, body_msg, expected_msg):
        """
          response body       
        :param body:
        :param body_msg:
        :param expected_msg:
        :return:
        """
        try:
            msg = body[body_msg]
            assert msg == expected_msg
            return True
 
        except:
            self.log.error("Response body msg != expected_msg, expected_msg is %s, body_msg is %s" % (expected_msg, body_msg))
            Consts.RESULT_LIST.append('fail')
 
            raise
 
    def assert_in_text(self, body, expected_msg):
        """
          response body          
        :param body:
        :param expected_msg:
        :return:
        """
        try:
            text = json.dumps(body, ensure_ascii=False)
            # print(text)
            assert expected_msg in text
            return True
 
        except:
            self.log.error("Response body Does not contain expected_msg, expected_msg is %s" % expected_msg)
            Consts.RESULT_LIST.append('fail')
 
            raise
7.요청 부분 코드

    def post_request(self, url, data, header):
        """
        Post  
        :param url:
        :param data:
        :param header:
        :return:
        """
        if not url.startswith('http://'):
            url = '%s%s' % ('http://', url)
            print(url)
        try:
            if data is None:
                response = self.get_session.post(url=url, headers=header)
            else:
                response = self.get_session.post(url=url, params=data, headers=header)
 
        except requests.RequestException as e:
            print('%s%s' % ('RequestException url: ', url))
            print(e)
            return ()
 
        except Exception as e:
            print('%s%s' % ('Exception url: ', url))
            print(e)
            return ()
 
        # time_consuming     ,     
        time_consuming = response.elapsed.microseconds/1000
        # time_total     ,    
        time_total = response.elapsed.total_seconds()
 
        Common.Consts.STRESS_LIST.append(time_consuming)
 
        response_dicts = dict()
        response_dicts['code'] = response.status_code
        try:
            response_dicts['body'] = response.json()
        except Exception as e:
            print(e)
            response_dicts['body'] = ''
 
        response_dicts['text'] = response.text
        response_dicts['time_consuming'] = time_consuming
        response_dicts['time_total'] = time_total
 
        return response_dicts
4.Allure 보고서 및 이메일
1.Allure 보고서 총람,다음 그림 참조:

Allure 보고서.jpg
2.이메일 은 다음 그림 을 보십시오.

Email.jpg
5.후속 최적화
1.Jenkins 를 통합 하고 Jenkins 플러그 인 을 사용 하여 Allure 보고 서 를 생 성 합 니 다.
2.다 중 스 레 드 병렬 인터페이스 자동화 테스트
3.인터페이스 암호 화,파라미터 암호 화
Pytest+request+Allure 의 인터페이스 자동화 프레임 워 크 실현 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 Pytest 인터페이스 자동화 프레임 워 크 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부탁드립니다!

좋은 웹페이지 즐겨찾기