Автоматизированные тестовые сценарии интерфейса — обычная проблема. До появления искусственного интеллекта существовало множество решений генерации. Например, как показано ниже, автоматизированные тестовые сценарии интерфейса генерируются с помощью har:
Однако описанный выше метод генерации по-прежнему имеет некоторые недостатки. Например, хотя har сам по себе может выражать определенную информацию об интерфейсе и бизнес-информацию, его нельзя использовать для выражения всех сценариев приложения и сценариев использования. Большинство сценариев приложений и сценариев использования описываются естественным языком. Анализ естественного языка — это то, что хорошо умеют большие языковые модели.
Ниже приведены 3 тестовых примера интерфейса:
тестовый модуль | название теста | Этапы тестирования | ожидаемые результаты |
---|---|---|---|
Функция интерфейса | Обычный запрос | Отправьте обычный GET-запрос | Код состояния ответа — 200, и возвращается IP-адрес запрашивающей стороны. |
Функция интерфейса | Недопустимый метод запроса | Отправьте запрос, отличный от GET, например POST или PUT. | Код состояния ответа: 405. |
Функция интерфейса | Неверный путь запроса | Отправить путь, который не существует | Код статуса ответа: 404. |
Ниже приведен har-файл для получения IP-интерфейса:
Далее соответствующие тестовые примеры будут автоматически сгенерированы с помощью этих двух файлов данных.
В этом процессе сам тестовый пример представляет собой естественный язык, а анализ и обработка естественного языка — это задача, с которой большие модели справляются очень хорошо. Весь процесс внедрения можно упростить с помощью LangChain.
Информация о подготовленном шаблоне слова подсказки следующая:
template = """
Вы инженер по автоматизированному тестированию, разбираетесь в стеке технологий. Python pytest запросы Библиотека
Ниже приводится конкретная информация об этом интерфейсе:
{context}
Question: {input}"""
Сценарий автоматического тестирования, созданный с помощью функциональных тестовых примеров, выглядит следующим образом:
#1. Test case: Обычный запрос
import pytest
import requests
def test_normal_request():
url = 'http://example.com/normal_request'
response = requests.get(url)
assert response.status_code == 200
assert response.json()['ip_address'] == 'requester_ip'
#2. Test case: Недопустимый метод запроса
import pytest
import requests
def test_invalid_request_method():
url = 'http://example.com/invalid_request_method'
response = requests.post(url)
assert response.status_code == 405
# 3. Test case: Неверный путь запроса
import pytest
import requests
def test_invalid_request_path():
url = 'http://example.com/invalid_request_path'
response = requests.get(url)
assert response.status_code == 404
Конечно, в ходе этого процесса можно ясно обнаружить, что автоматически сгенерированные варианты использования не содержат никакой информации об интерфейсе. Причина в том, что в предоставляемых нами данных нет информации об интерфейсе.
Далее информация данных интерфейса в файле har будет прочитана и объединена со сценарием.
Шаблон слова-подсказки выглядит следующим образом:
шаблон = """
Вы инженер по автоматизации тестирования,ты очень хорошо знакомзапросы Библиотека
{context}
Question:
Пожалуйста, извлеките информацию из запроса на основе входящей информации интерфейса. ip 、 url 、method、json。
Ключевое значение — это поле, упомянутое ранее. Если оно не существует, добавлять его не нужно. Если есть, извлеките соответствующее значение.
Возвращаемый формат должен быть в формате json.
"""
Сгенерированные результаты следующие:
{
"ip": "182.92.156.22",
"url": "https://httpbin.ceshiren.com/ip",
"method": "GET"
}
После объединения описанного выше процесса полная версия кода выглядит следующим образом.
из langchain_community.chat_models.openai импортировать ChatOpenAI
из langchain_community.document_loaders.text импортировать TextLoader
из langchain_core.output_parsers импортировать JsonOutputParser, StrOutputParser
из langchain_core.prompts импорт PromptTemplate
из langchain_core.runnables импортировать RunnablePassthrough
из utils.langchain_debug импортировать langchain_debug
langchain_debug()
llm = ЧатOpenAI()
защита get_by_filename(имя файла):
информация = TextLoader(f'./data/{filename}')
вернуть информацию.load()
защита get_case_data(_):
шаблон = """
Вы инженер по автоматизации тестирования,ты очень хорошо знакомзапросы Библиотека
{context}
Question: {input}
Пожалуйста, извлеките информацию из запроса на основе входящей информации интерфейса. ip 、 url 、method、json。
Ключевое значение — это поле, упомянутое ранее. Если оно не существует, добавлять его не нужно. Если есть, извлеките соответствующее значение.
Возвращаемый формат должен быть в формате json.
"""
prompt = PromptTemplate.from_template(template=template, )
data_chain = (
RunnablePassthrough.assign(context=lambda x: get_by_filename("ip.har"), )
| prompt
| llm
| JsonOutputParser()
)
return data_chain
def get_case():
"""
Генерируйте тестовые данные из больших моделей.
:return:
"""
template = """
Вы инженер по автоматизированному тестированию, разбираетесь в стеке технологий. Python pytest запросы Библиотека
Ниже приводится конкретная информация об этом интерфейсе: ваш
{context}
Информация о запрошенном параметре будет введена в словарь, а входное содержимое
{req}
Question: {input}"""
# Подсказка шаблона, вывод json форматировать ответ
prompt = PromptTemplate.from_template(
template=template, )
chain = (
RunnablePassthrough.
assign(context=lambda x: get_by_filename("Получить ip testcase.md"),
req=get_case_data)
| prompt
| llm
| StrOutputParser()
)
input_template = """
Согласно Этапам каждого тестового примера тестирование, генерация соответствующей информации о тестовых данных,
Для каждого тестового примера требуется соответствующая отдельная функция pytest.
"""
print(chain.invoke({"input": input_template}))
if __name__ == '__main__':
get_case()