기술나눔

인터페이스 테스트란 무엇이며 인터페이스 테스트를 어떻게 구현합니까?

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1. 인터페이스 테스트란 무엇입니까?
이름에서 알 수 있듯이 인터페이스 테스트는 주로 데이터 교환, 전송 및 제어 관리 프로세스, 상호 논리적 종속성을 확인하기 위해 시스템 또는 구성 요소 간의 인터페이스를 테스트하는 것입니다. 인터페이스 프로토콜은 HTTP, WebService, Dubbo, Thrift, Socket 및 기타 유형으로 구분됩니다. 테스트 유형은 주로 기능 테스트, 성능 테스트, 안정성 테스트, 보안 테스트 등으로 구분됩니다.

계층화된 테스트의 "피라미드" 모델에서 인터페이스 테스트는 서비스 통합 테스트의 두 번째 계층에 속합니다. UI 계층(주로 WEB 또는 APP) 자동화 테스트와 비교할 때 인터페이스 자동화 테스트는 더 큰 이점이 있고 구현이 쉽고 유지 관리 비용이 낮으며 입출력 비율이 더 높습니다. 모든 회사가 수행하는 첫 번째 선택입니다. 자동화된 테스트.

아래에서는 요구 사항 분석부터 사용 사례 설계, 스크립트 작성, 테스트 실행, 결과 분석까지 인터페이스 자동화 테스트 프로세스를 완전히 소개하기 위해 HTTP 인터페이스를 예로 들어 완전한 사용 사례 설계 및 테스트 스크립트를 제공합니다.

2. 기본 프로세스
기본 인터페이스 기능 자동화 테스트 프로세스는 다음과 같습니다.

요구사항 분석->유스케이스 설계->스크립트 개발->테스트 실행->결과 분석

2.1 샘플 인터페이스
인터페이스 이름: Douban 영화 검색

인터페이스 문서 주소: https://developers.douban.com/wiki/?title=movie_v2#search

인터페이스 호출 예:

1) 출연진 및 제작진 검색: https://api.douban.com/v2/movie/search?q=Zhang Yimou

2) 영화 제목으로 검색: https://api.douban.com/v2/movie/search?q=西游之西游

3) 장르별 검색 : https://api.douban.com/v2/movie/search?tag=comedy


3. 분석 필요
요구사항 분석은 요구사항, 설계 등의 문서를 의미하며, 요구사항에 대한 이해를 바탕으로 내부 구현 로직을 이해하는 것도 필요하며, 이 단계에서는 요구사항 및 설계에서 불합리하거나 누락된 부분이 지적될 수 있습니다.

예: Douban 영화 검색 인터페이스에서 내가 이해하는 요구 사항은 영화 제목, 출연진 및 태그 검색을 지원하고 검색 결과를 페이지로 반환하는 것입니다.

4. 사용 사례 디자인
유스 케이스 디자인은 인터페이스 테스트 요구 사항을 이해하고 MindManager 또는 XMind와 같은 마인드 매핑 소프트웨어를 사용하여 테스트 케이스 디자인을 작성하는 것을 기반으로 하며 주요 내용에는 매개 변수 확인, 기능 확인, 비즈니스 시나리오 확인, 보안 및 성능 확인 등이 포함됩니다. 일반적으로 사용됩니다. 사용 사례 설계 방법에는 동등 클래스 분할, 경계 값 분석, 시나리오 분석, 원인 및 결과 다이어그램, 직교 테이블 등이 포함됩니다.

Douban 영화 검색 인터페이스 기능 테스트 부분에서는 주로 매개변수 검증, 기능 검증, 비즈니스 시나리오 검증의 세 가지 측면에 중점을 두었습니다. 설계 테스트 예는 다음과 같습니다.

5. 스크립트 개발

위에 작성된 테스트 케이스 디자인을 기반으로 python+nosetests 프레임워크를 사용하여 관련 자동화 테스트 스크립트를 작성했습니다. 인터페이스 자동화 테스트, 자동 실행 및 테스트 보고서 이메일 전송 기능을 완전히 실현할 수 있습니다.

5.1 관련 lib 설치

필요한 lib 라이브러리는 다음과 같습니다. pip 명령을 사용하여 설치할 수 있습니다.

  1. pip install nose
  2. pip install nose-html-reporting
  3. pip install requests

5.2 인터페이스 호출

요청 라이브러리를 사용하면 위의 인터페이스 호출 메서드를 쉽게 작성할 수 있습니다(예: q=Andy Lau 검색, 샘플 코드는 다음과 같습니다).

  1. #coding=utf-8
  2. import requests
  3. import json
  4. url = 'https://api.douban.com/v2/movie/search'
  5. params=dict(q=u'刘德华')
  6. r = requests.get(url, params=params)
  7. print 'Search Params:n', json.dumps(params, ensure_ascii=False)
  8. print 'Search Response:n', json.dumps(r.json(), ensure_ascii=False, indent=4)

실제로 자동화된 테스트 스크립트를 작성할 때 일부 캡슐화를 수행해야 합니다. 다음 코드에서는 Douban 영화 검색 인터페이스를 캡슐화합니다. test_q 메서드는 qs 목록의 각 테스트 세트를 편리하게 반복하기 위해 nosetests에서 제공하는 항복 메서드만 사용하면 됩니다.

  1. class test_doubanSearch(object):
  2. @staticmethod
  3. def search(params, expectNum=None):
  4. url = 'https://api.douban.com/v2/movie/search'
  5. r = requests.get(url, params=params)
  6. print 'Search Params:n', json.dumps(params, ensure_ascii=False)
  7. print 'Search Response:n', json.dumps(r.json(), ensure_ascii=False, indent=4)
  8. def test_q(self):
  9. # 校验搜索条件 q
  10. qs = [u'白夜追凶', u'大话西游', u'周星驰', u'张艺谋', u'周星驰,吴孟达', u'张艺谋,巩俐', u'周星驰,大话西游', u'白夜追凶,潘粤明']
  11. for q in qs:
  12. params = dict(q=q)
  13. f = partial(test_doubanSearch.search, params)
  14. f.description = json.dumps(params, ensure_ascii=False).encode('utf-8')
  15. yield (f,)

테스트 케이스 설계에 따라 각 기능에 대해 순차적으로 자동화된 테스트 스크립트를 작성할 수 있습니다.

5.3 결과 검증
인터페이스를 수동으로 테스트할 때는 인터페이스에서 반환된 결과를 기반으로 테스트 통과 여부를 판단해야 합니다. 자동화된 테스트에서도 마찬가지입니다.

이 인터페이스의 경우 "q=Andy Lau"를 검색하고 반환된 결과에 "배우 Andy Lau 또는 영화 제목 Andy Lau"가 포함되어 있는지 확인해야 합니다. "tag=comedy"를 검색할 때 유형을 확인해야 합니다. 반환된 결과에 영화가 있는지, 결과를 페이징할 때 반환된 결과의 개수가 맞는지 확인이 필요합니다. 전체 결과 확인 코드는 다음과 같습니다.

  1. class check_response():
  2. @staticmethod
  3. def check_result(response, params, expectNum=None):
  4. # 由于搜索结果存在模糊匹配的情况,这里简单处理只校验第一个返回结果的正确性
  5. if expectNum is not None:
  6. # 期望结果数目不为None时,只判断返回结果数目
  7. eq_(expectNum, len(response['subjects']), '{0}!={1}'.format(expectNum, len(response['subjects'])))
  8. else:
  9. if not response['subjects']:
  10. # 结果为空,直接返回失败
  11. assert False
  12. else:
  13. # 结果不为空,校验第一个结果
  14. subject = response['subjects'][0]
  15. # 先校验搜索条件tag
  16. if params.get('tag'):
  17. for word in params['tag'].split(','):
  18. genres = subject['genres']
  19. ok_(word in genres, 'Check {0} failed!'.format(word.encode('utf-8')))
  20. # 再校验搜索条件q
  21. elif params.get('q'):
  22. # 依次判断片名,导演或演员中是否含有搜索词,任意一个含有则返回成功
  23. for word in params['q'].split(','):
  24. title = [subject['title']]
  25. casts = [i['name'] for i in subject['casts']]
  26. directors = [i['name'] for i in subject['directors']]
  27. total = title + casts + directors
  28. ok_(any(word.lower() in i.lower() for i in total),
  29. 'Check {0} failed!'.format(word.encode('utf-8')))
  30. @staticmethod
  31. def check_pageSize(response):
  32. # 判断分页结果数目是否正确
  33. count = response.get('count')
  34. start = response.get('start')
  35. total = response.get('total')
  36. diff = total - start
  37. if diff >= count:
  38. expectPageSize = count
  39. elif count > diff > 0:
  40. expectPageSize = diff
  41. else:
  42. expectPageSize = 0
  43. eq_(expectPageSize, len(response['subjects']), '{0}!={1}'.format(expectPageSize, len(response['subjects'])))

5.4 테스트 실행

위 테스트 스크립트의 경우 nosetests 명령을 사용하여 자동 테스트를 쉽게 실행할 수 있고 nose-html-reporting 플러그인을 사용하여 html 형식 테스트 보고서를 생성할 수 있습니다.

다음과 같이 명령을 실행합니다.

nosetests -v test_doubanSearch.py:test_doubanSearch --with-html --html-report=TestReport.html

5.5 이메일 보고서 보내기

테스트가 완료된 후 smtplib 모듈에서 제공하는 방법을 사용하여 html 형식 테스트 보고서를 보낼 수 있습니다. 기본 프로세스는 테스트 보고서 읽기 -> 이메일 내용 및 첨부 파일 추가 -> 메일 서버 연결 -> 이메일 보내기 -> 종료입니다. 샘플 코드는 다음과 같습니다.

  1. import smtplib
  2. from email.mime.text import MIMEText
  3. from email.mime.multipart import MIMEMultipart
  4. def send_mail():
  5. # 读取测试报告内容
  6. with open(report_file, 'r') as f:
  7. content = f.read().decode('utf-8')
  8. msg = MIMEMultipart('mixed')
  9. # 添加邮件内容
  10. msg_html = MIMEText(content, 'html', 'utf-8')
  11. msg.attach(msg_html)
  12. # 添加附件
  13. msg_attachment = MIMEText(content, 'html', 'utf-8')
  14. msg_attachment["Content-Disposition"] = 'attachment; filename="{0}"'.format(report_file)
  15. msg.attach(msg_attachment)
  16. msg['Subject'] = mail_subjet
  17. msg['From'] = mail_user
  18. msg['To'] = ';'.join(mail_to)
  19. try:
  20. # 连接邮件服务器
  21. s = smtplib.SMTP(mail_host, 25)
  22. # 登陆
  23. s.login(mail_user, mail_pwd)
  24. # 发送邮件
  25. s.sendmail(mail_user, mail_to, msg.as_string())
  26. # 退出
  27. s.quit()
  28. except Exception as e:
  29. print "Exceptioin ", e

6. 결과 분석

nosetests가 실행된 후 생성된 테스트 보고서를 열면 이 테스트에서 총 51개의 테스트 사례가 실행되었으며 그 중 50개는 성공했고 그 중 하나는 실패했음을 알 수 있습니다.

실패한 사용 사례에서는 전달된 매개변수가 {"count": -10, "tag": "Comedy"}이고 이때 반환된 결과 수가 예상 결과와 일치하지 않는 것을 확인할 수 있습니다( count가 음수이고 예상되는 결과는 다음과 같습니다. 인터페이스에서 오류를 보고하거나 기본값인 20을 사용하지만, 반환된 실제 결과 수는 189입니다. 서둘러 Douban에 버그를 보고하세요. - -)

7. 전체 스크립트
Douban 영화 검색 인터페이스의 전체 자동화 테스트 스크립트를 GitHub에 업로드했습니다. 다운로드 주소: master의 test_demo/test_douban · lovesoo/test_demo · GitHub

다운로드가 완료된 후 다음 명령을 사용하여 전체 인터페이스 자동화 테스트를 수행하고 이메일을 통해 최종 테스트 보고서를 보냅니다.

파이썬 test_doubanSearch.py
마지막으로 테스트 보고서 이메일을 보내십시오. 스크린샷은 다음과 같습니다.

마지막으로, 제 글을 주의 깊게 읽어주시는 모든 분들께 감사의 말씀을 전하고 싶습니다. 상호성은 항상 필요합니다. 비록 그다지 귀중한 것은 아니지만, 사용하실 수 있다면 직접 가져가셔도 됩니다.

이 정보는 [소프트웨어 테스팅] 친구들을 위한 가장 포괄적이고 완전한 준비 창고가 되어야 합니다. 이 창고는 또한 가장 어려운 여정을 통해 수만 명의 테스트 엔지니어와 동행했습니다.