моя контактная информация
Почтамезофия@protonmail.com
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 мы в основном фокусируемся на трех аспектах: проверка параметров, проверка функций и проверка бизнес-сценария. Примеры тестирования дизайна следующие:
На основе описанного выше сценария тестирования мы использовали среду Python+nosetests для написания соответствующих сценариев автоматического тестирования. Он может полностью реализовать функции автоматического тестирования интерфейса, автоматического выполнения и отправки отчетов об испытаниях по электронной почте.
Необходимые библиотеки lib: Вы можете установить их с помощью команды pip:
-
- pip install nose
-
- pip install nose-html-reporting
-
- pip install requests
Используя библиотеку запросов, мы можем легко написать описанный выше метод вызова интерфейса (например, поиск q=Andy Lau, пример кода выглядит следующим образом):
-
- #coding=utf-8
-
- import requests
-
- import json
-
-
- url = 'https://api.douban.com/v2/movie/search'
-
- params=dict(q=u'刘德华')
-
- r = requests.get(url, params=params)
-
- print 'Search Params:n', json.dumps(params, ensure_ascii=False)
-
- print 'Search Response:n', json.dumps(r.json(), ensure_ascii=False, indent=4)
При написании автоматических тестовых сценариев нам необходимо выполнить некоторую инкапсуляцию. В следующем коде мы инкапсулируем интерфейс поиска фильмов Дубана. Методу test_q достаточно использовать метод доходности, предоставляемый носовыми тестами, для удобного прохода по каждому набору тестов в списке qs:
-
- class test_doubanSearch(object):
-
-
- @staticmethod
-
- def search(params, expectNum=None):
-
- url = 'https://api.douban.com/v2/movie/search'
-
- r = requests.get(url, params=params)
-
- print 'Search Params:n', json.dumps(params, ensure_ascii=False)
-
- print 'Search Response:n', json.dumps(r.json(), ensure_ascii=False, indent=4)
-
-
- def test_q(self):
-
- # 校验搜索条件 q
-
- qs = [u'白夜追凶', u'大话西游', u'周星驰', u'张艺谋', u'周星驰,吴孟达', u'张艺谋,巩俐', u'周星驰,大话西游', u'白夜追凶,潘粤明']
-
- for q in qs:
-
- params = dict(q=q)
-
- f = partial(test_doubanSearch.search, params)
-
- f.description = json.dumps(params, ensure_ascii=False).encode('utf-8')
-
- yield (f,)
Мы можем написать автоматизированные тестовые сценарии для каждой функции последовательно в соответствии с дизайном тестового примера.
5.3 Проверка результатов
При тестировании интерфейса вручную нам необходимо судить о том, пройден ли тест, на основе результатов, возвращаемых интерфейсом. То же самое относится и к автоматическому тестированию.
Для этого интерфейса мы ищем «q=Энди Лау» и нам нужно определить, содержат ли возвращаемые результаты «актёр Энди Лау или название фильма Энди Лау». При поиске «тег=комедия» нам нужно определить тип. фильм в возвращаемых результатах. Является ли он «комедией», необходимо проверить правильность количества возвращаемых результатов при разбивке результатов и т. д. Полный код проверки результата выглядит следующим образом:
-
- class check_response():
-
- @staticmethod
-
- def check_result(response, params, expectNum=None):
-
- # 由于搜索结果存在模糊匹配的情况,这里简单处理只校验第一个返回结果的正确性
-
- if expectNum is not None:
-
- # 期望结果数目不为None时,只判断返回结果数目
-
- eq_(expectNum, len(response['subjects']), '{0}!={1}'.format(expectNum, len(response['subjects'])))
-
- else:
-
- if not response['subjects']:
-
- # 结果为空,直接返回失败
-
- assert False
-
- else:
-
- # 结果不为空,校验第一个结果
-
- subject = response['subjects'][0]
-
- # 先校验搜索条件tag
-
- if params.get('tag'):
-
- for word in params['tag'].split(','):
-
- genres = subject['genres']
-
- ok_(word in genres, 'Check {0} failed!'.format(word.encode('utf-8')))
-
-
- # 再校验搜索条件q
-
- elif params.get('q'):
-
- # 依次判断片名,导演或演员中是否含有搜索词,任意一个含有则返回成功
-
- for word in params['q'].split(','):
-
- title = [subject['title']]
-
- casts = [i['name'] for i in subject['casts']]
-
- directors = [i['name'] for i in subject['directors']]
-
- total = title + casts + directors
-
- ok_(any(word.lower() in i.lower() for i in total),
-
- 'Check {0} failed!'.format(word.encode('utf-8')))
-
-
- @staticmethod
-
- def check_pageSize(response):
-
- # 判断分页结果数目是否正确
-
- count = response.get('count')
-
- start = response.get('start')
-
- total = response.get('total')
-
- diff = total - start
-
-
- if diff >= count:
-
- expectPageSize = count
-
- elif count > diff > 0:
-
- expectPageSize = diff
-
- else:
-
- expectPageSize = 0
-
-
- eq_(expectPageSize, len(response['subjects']), '{0}!={1}'.format(expectPageSize, len(response['subjects'])))
Для приведенного выше тестового сценария мы можем использовать команду носетестс для простого запуска автоматических тестов и использовать плагин носа-html-reporting для создания отчетов о тестировании в формате html.
Запустите команду следующим образом:
nosetests -v test_doubanSearch.py:test_doubanSearch --with-html --html-report=TestReport.html
После завершения теста мы можем использовать метод, предоставляемый модулем smtplib, для отправки отчета о тестировании в формате html. Основной процесс — прочитать отчет о тестировании -> добавить содержимое электронного письма и вложения -> подключиться к почтовому серверу -> отправить электронное письмо -> выйти. Пример кода выглядит следующим образом:
-
- import smtplib
-
- from email.mime.text import MIMEText
-
- from email.mime.multipart import MIMEMultipart
-
-
- def send_mail():
-
- # 读取测试报告内容
-
- with open(report_file, 'r') as f:
-
- content = f.read().decode('utf-8')
-
-
- msg = MIMEMultipart('mixed')
-
- # 添加邮件内容
-
- msg_html = MIMEText(content, 'html', 'utf-8')
-
- msg.attach(msg_html)
-
-
- # 添加附件
-
- msg_attachment = MIMEText(content, 'html', 'utf-8')
-
- msg_attachment["Content-Disposition"] = 'attachment; filename="{0}"'.format(report_file)
-
- msg.attach(msg_attachment)
-
-
- msg['Subject'] = mail_subjet
-
- msg['From'] = mail_user
-
- msg['To'] = ';'.join(mail_to)
-
- try:
-
- # 连接邮件服务器
-
- s = smtplib.SMTP(mail_host, 25)
-
- # 登陆
-
- s.login(mail_user, mail_pwd)
-
- # 发送邮件
-
- s.sendmail(mail_user, mail_to, msg.as_string())
-
- # 退出
-
- s.quit()
-
- except Exception as e:
-
- print "Exceptioin ", e
Откройте отчет о тестировании, созданный после запуска носовых тестов. Видно, что в этом тесте был выполнен в общей сложности 51 тестовый пример, 50 из которых были успешными, а один — неудачным.
В случае неудачного использования вы можете видеть, что переданные параметры: {"count": -10, "tag": "Comedy"}, а количество результатов, возвращаемых в это время, не соответствует нашим ожидаемым результатам (когда count — отрицательное число, ожидаемый результат — Интерфейс сообщает об ошибке или использует значение по умолчанию 20, но фактическое количество возвращаемых результатов равно 189. Поторопитесь и сообщите об ошибке Дубану - -)
7. Полный сценарий
Я загрузил полный сценарий автоматического тестирования интерфейса поиска фильмов Douban на GitHub. Адрес загрузки: test_demo/test_douban на master · lovesoo/test_demo · GitHub
После завершения загрузки используйте следующую команду, чтобы выполнить полное автоматизированное тестирование интерфейса и отправить окончательный отчет о тестировании по электронной почте:
pythontest_doubanSearch.py
Наконец, отправьте электронное письмо с отчетом об испытаниях, снимок экрана выглядит следующим образом.
В заключение я хотел бы поблагодарить всех, кто внимательно читает мою статью. Взаимность всегда необходима. Хотя это не очень ценная вещь, если вы умеете ею пользоваться, вы можете взять ее напрямую:
Эта информация должна стать наиболее полной и полной подготовкой для друзей [по тестированию программного обеспечения]. Этот склад также сопровождал десятки тысяч инженеров-тестировщиков в самом трудном путешествии. Я надеюсь, что он также может помочь вам!