Обмен технологиями

Что такое тестирование интерфейса и как мы его реализуем?

2024-07-12

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

1. Что такое тестирование интерфейса?
Как следует из названия, тестирование интерфейса предназначено для тестирования интерфейса между системами или компонентами, главным образом для проверки обмена данными, процессов управления передачей и контролем, а также взаимных логических зависимостей. Протоколы интерфейса делятся на HTTP, WebService, Dubbo, Thrift, Socket и другие типы. Типы тестов в основном делятся на функциональное тестирование, тестирование производительности, тестирование стабильности, тестирование безопасности и т. д.

В «пирамидальной» модели многоуровневого тестирования тестирование интерфейса относится ко второму уровню тестирования интеграции сервисов. По сравнению с автоматизированным тестированием уровня пользовательского интерфейса (в основном 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: Вы можете установить их с помощью команды 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)

При написании автоматических тестовых сценариев нам необходимо выполнить некоторую инкапсуляцию. В следующем коде мы инкапсулируем интерфейс поиска фильмов Дубана. Методу test_q достаточно использовать метод доходности, предоставляемый носовыми тестами, для удобного прохода по каждому набору тестов в списке qs:

  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=Энди Лау» и нам нужно определить, содержат ли возвращаемые результаты «актёр Энди Лау или название фильма Энди Лау». При поиске «тег=комедия» нам нужно определить тип. фильм в возвращаемых результатах. Является ли он «комедией», необходимо проверить правильность количества возвращаемых результатов при разбивке результатов и т. д. Полный код проверки результата выглядит следующим образом:

  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 Выполнение тестов

Для приведенного выше тестового сценария мы можем использовать команду носетестс для простого запуска автоматических тестов и использовать плагин носа-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. Анализ результатов

Откройте отчет о тестировании, созданный после запуска носовых тестов. Видно, что в этом тесте был выполнен в общей сложности 51 тестовый пример, 50 из которых были успешными, а один — неудачным.

В случае неудачного использования вы можете видеть, что переданные параметры: {"count": -10, "tag": "Comedy"}, а количество результатов, возвращаемых в это время, не соответствует нашим ожидаемым результатам (когда count — отрицательное число, ожидаемый результат — Интерфейс сообщает об ошибке или использует значение по умолчанию 20, но фактическое количество возвращаемых результатов равно 189. Поторопитесь и сообщите об ошибке Дубану - -)

7. Полный сценарий
Я загрузил полный сценарий автоматического тестирования интерфейса поиска фильмов Douban на GitHub. Адрес загрузки: test_demo/test_douban на master · lovesoo/test_demo · GitHub

После завершения загрузки используйте следующую команду, чтобы выполнить полное автоматизированное тестирование интерфейса и отправить окончательный отчет о тестировании по электронной почте:

pythontest_doubanSearch.py
Наконец, отправьте электронное письмо с отчетом об испытаниях, снимок экрана выглядит следующим образом.

В заключение я хотел бы поблагодарить всех, кто внимательно читает мою статью. Взаимность всегда необходима. Хотя это не очень ценная вещь, если вы умеете ею пользоваться, вы можете взять ее напрямую:

Эта информация должна стать наиболее полной и полной подготовкой для друзей [по тестированию программного обеспечения]. Этот склад также сопровождал десятки тысяч инженеров-тестировщиков в самом трудном путешествии. Я надеюсь, что он также может помочь вам!