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

Эффективные модульные тесты не только捕获 ошибки, но и помогают вам быть уверенным в том, что ваше код может быть поддержан и надежден. Но для ручного создания обширного набора модульных тестов требуется время и ресурсы.

В последнее время в сфере искусственного интеллекта появились новые разработки, которые пообещают automate the unit test development processes. В феврале исследователиMeta выпустили работу о Automated Unit Test Improvement using Large Language Models. Это представило инновационный метод для автоматизации модульных тестов.

Их исследование сфокусировано на новом инструменте под названием TestGen-LLM, который исследует возможности использования больших языковых моделей для анализа уже существующих модульных тестов и улучшения их для увеличения покрытия кода.

хотя код TestGen-LLM еще не был выпущен, я представлю в этой статье открытый аналог, вдохновленный их исследованиями. Вы узнаете, как он генерирует наборы тестов, почему он лучше большинства LLM и где можно получить этот технологический продукт и начать его испытывать.

CONTENT TABLE

Meta’s TestGen-LLM

Meta’s TestGen-LLM решает сложные задачи написания отдельных тестов, используя силу Large Language Models (LLMs). General-purpose LLMs, такие как Gemini или ChatGPT, могут испытывать трудности с конкретной областью кода тестов, синтаксисом тестирования и генерацией тестов, не добавляющих ценности. Но TestGen-LLM специально разработан для тестирования модулей.

Это специализация позволяет ему понимать сложности структуры кода и логики тестирования, что приводит к более сфокусированным наборам тестов и генерации тестов, которые на самом деле добавляют ценность и увеличивают покрытие кода.

TestGen-LLM способен оценивать отдельные тесты и идентифицировать области для улучшения. Это достигается благодаря тому, что он понимает общие модели тестирования, с которыми он был обучен. Но генерация тестов в одиночку недостаточна для оптимального покрытия кода.

Researchers at Meta implemented safeguards within TestGen-LLM to ensure the effectiveness of the tests it writes. These safeguards, referred to as filters, act as a quality control mechanism. They eliminate suggestions that:

  • wouldn’t compile

  • fail consistently, or

  • fail to actually improve code coverage (suggestions that are already covered by other tests).

Как TestGen-LLM работает?

TestGen-LLM использует подход, названный “Уверенной LLM-основанной Инженерией Software” (Assured LLMSE). TestGen-LLM просто добавляет дополнительные тесты в существующий класс тестов, сохраняя все текущие тесты, тем самым гарантируя, что не будет происходить регрессии.

Workflow теста генерации(Из документа TestGen_LLM)

TestGen-LLM генерирует ряд тестов, затем фильтрует тесты, которые не работают и игнорирует те, которые не проходят. Наконец, он отбрасывает те, которые не увеличивают покрытие кода.

После того, как Meta использовала TestGen-LLM для автоматизации набора тестов, она использовала человеческого рецензента, чтобы принимать или отклонять тесты, где уровень приемки сгенерированных тестов достиг 73% в лучших опубликованных случаях.

По сообщению в документе, TestGen-LLM генерирует один тест на каждом запуске, который затем добавляется в существующий набор тестов, который ранее написал разработчик. Но это не обязательно генерирует тесты для любого given теста набора.

Эффективность TestGen-LLM была продемонстрирована на внутреннемMeta тесте-а-thon. там сервис использовался для анализа существующих наборов тестов и предлагания улучшений. Результаты были многообещающими:

“75% тестныхケース TestGen-LLM правильно построены, 57% устойчиво проходили, и 25% увеличили покрытие. во времяMeta тесте-а-thon для Instagram и Facebook, он улучшил 11,5% всех классов, к которым он был применен, с 73% рекомендаций его принималисьMeta Software Engineers для производства установки”.

Также рекомендации от TestGen-LLM были признаны полезными и актуальными разработчиками, которые приняли участие в тесте-а-thon.

Открытая имPLEMENTACIJA (Cover-Agent)

Исследование TestGen-LLMMeta имеет потенциал существенно изменить испытания и автоматизированное генерирование тестов. Скорее всего, этот инструмент поможет улучшить покрытие кода и ускорить создание тестов с использованием LLM, особенно тренированных на коде. Но эта технология недоступна для использования каждым, поскольку код TestGen-LLM не был выпущен.

Разработчики, увлеченные этой технологией, скорее всего, остались недовольны отсутствием общедоступного кода.Meta TestGen-LLM исследование дает представление о будущем автоматизированных тестов.

Возможность проникнуть в внутренние работы новейших технологий, понять процессы принятия решений и, возможно, помочь塑造 его развитию очень привлекательна. Но хотя отсутствие кода Meta является препятствием, существует открытая имPLEMENTACIJA под названием Cover-Agent, которая может стать полезным альтернативом.

CodiumAI's Cover-Agent является первой открытой имPLEMENTACIJО автоматизированного инструмента тестирования на основе TestGen-LLM. Стилизованная подMeta исследование, Cover-Agent теперь находится на передовых позициях развитий открытой имPLEMENTACIJI AI-управляемого испытания в качестве единицы тестирования.

为什么需要特定 focuses on testing LLM?

因为大多数 LLM (такие как ChatGPT и Gemini) способны генерировать тесты, тогда зачем новую технологию?

Вот, Cover-Agent и TestGen-LLM были созданы как следующий шаг в эволюции эффективного модульного тестирования. Их цель состоит в том, чтобы избежать обычных ловушек, в которые сталкиваются разработчики при генерации тестов с помощью LLM, таких как:

  • Галлюцинации LLM

  • Генерация тестов, которые не добавляют ценности

  • Генерация тестов, которые опускают некоторые части кода, в результате чего получается низкая покрытие кода

Чтобы преодолеть такие проблемы (особенно для регрессионного модульного тестирования), исследователи TestGen-LLM выдвинули следующие критерии, которым должны соответствовать сгенерированные тесты, прежде чем тест может быть принят:

  • Скомпилировался ли сгенерированный тест и работает ли он правильно?

  • Увеличивает ли тест покрытие кода?

  • Добавляет ли он ценность?

  • Соответствует ли он любым дополнительным требованиям, которые могут быть у нас?

Это основные вопросы и проблемы, которые должен решить сгенерированный тест, прежде чем он будет считаться улучшением существующей технологии. Cover-Agent обеспечивает тесты, которые ответят на эти вопросы с удивительно высокой степенью.

Как работает Cover-Agent?

Cover-Agent является частью более широкой серии утилит, предназначенных для автоматизации создания модульных тестов для программных проектов. Используя генеративную модель ИИ TestGen-LLM, она нацелена на упрощение и ускорение процесса тестирования, обеспечивая высокое качество разработки программного обеспечения.

Система состоит из нескольких компонентов:

  • Test Runner: Выполняет команды или скрипты для запуска набора тестов и генерации отчетов о покрытии кода.

  • Coverage Parser: Проверяет, что покрытие кода увеличивается по мере добавления тестов, обеспечивая, что новые тесты способствуют общей эффективности тестирования.

  • Prompt Builder: Собирает необходимые данные из кодовой базы и строит запрос, который будет передан большой языковой модели (LLM).

  • AI Caller: Взаимодействует с LLM для генерации тестов на основе предоставленного запроса.

Эти компоненты работают вместе с TestGen-LLM для генерации только тех тестов, которые гарантированно улучшат существующую кодовую базу.

Как использовать Cover-Agent

Требования

Для того, чтобы начать использовать Cover-Agent, вам необходимо соответствовать следующим требованиям:

  • OPENAI_API_KEY должен быть установлен в ваших environment variables, что является обязательным для вызова OpenAI API.

  • Инструмент Code Coverage: Для правильной работы инструмента требуется Cobertura XML code coverage report. Например, в Python вы могли бы использовать pytest-cov. Добавьте опцию --cov-report=xml, когда вы запускаете Pytest.

Установка

Если вы запускаете Cover-Agent напрямую из репозитория, вам также потребуется:

  • Установлен Python на вашем системе.

  • Установлен Poetry для управления зависимостями Python-пакетов. Инструкции по установке Poetry здесь.

СтатическоеRuntime

Вы можете установить Cover-Agent как Python Pip пакет или запустить его как самостоятельное исполняемое файло.

Python Pip

Чтобы установить Python Pip пакет непосредственно через GitHub, запустите следующий запрос:

pip install git+https://github.com/Codium-ai/cover-agent.git

Бинарник

Вы можете запускать бинарник без установки Python среды на вашем системе (например, внутри контейнера Docker, который не содержит Python). Вы можете скачать выпуск для вашей системы, перейдя на страницу выпусков проекта.

Установка репозитория

Для установки всех зависимостей и запуска проекта с исходником запустите следующий запрос:

poetry install

Выполнение кода

После скачивания исполняемого файла или установки Pip пакета вы можете запустить Cover-Agent, чтобы генерировать и проверять универсальные тесты.

Вы можете выполнять его из командной строки с использованием следующего запроса:

cover-agent \
--source-file-path "path_to_source_file" \
--test-file-path "path_to_test_file" \
--code-coverage-report-path "path_to_coverage_report.xml" \
--test-command "test_command_to_run" \
--test-command-dir "directory_to_run_test_command/" \
--coverage-type "type_of_coverage_report" \
--desired-coverage "desired_coverage_between_0_and_100" \
--max-iterations "max_number_of_llm_iterations" \
 --included-files "<optional_list_of_files_to_include>"

Вы можете использовать примерные проекты в этом репозитории, чтобы запустить этот код как тест.

Параметры команды

  • source-file-path: Pfad des Dateis, das die Funktionen oder den Code enthält, den wir testen möchten.

  • test-file-path: Pfad des Dateis, in das der Agent die Tests schreibt. Es ist am besten, dass Sie ein Skelett für diese Datei erstellen, das mindestens einen Test und die notwendigen Import-Anweisungen enthält.

  • путь_к_отчету_об_области_кoverage:путь, где сохраняется отчет о покрытии кода.

  • команда_теста:команда для запуска тестов (например pytest).

  • директория_команды_теста:директория, где команда теста должна запускаться. Установите этот параметр в корневую директорию или местонахождение основного файла, чтобы избегать проблем с относительными импортами.

  • тип_покрытия:тип покрытия для использования. Cobertura является хорошим стандартным значением.

  • желаемое_покрытие: цель покрытия. Higher is better, though 100% is often impractical.

  • максимальное_количество_итераций:количество раз, которые агент должен попытаться сгенерировать тестовый код. больше итераций может привести к более высоком использованию токенов OpenAI.

  • дополнительные_ инструкции: Prompts для обеспечения того, чтобы код был написан в определенном способе. например, здесь мы указали, что код должен быть форматирован для работы в тестовом классе.

Upon running the command, the agent starts writing and iterating on the tests.

Как использовать Cover-Agent

Пора испытать Cover-Agent. мы будем использовать простой калькулятор.py приложение для сравнения покрытия кода для ручных и автоматизированных тестов.

Ручные тесты

def add(a, b):
    return a + b

def subtract(a, b):
    return a - b

def multiply(a, b):
    return a * b

def divide(a, b):
    if b == 0:
        raise ValueError("Cannot divide by zero")
    return a / b

Это test_calculator.py, помещенный в папке test.

# tests/test_calculator.py
from calculator import add, subtract, multiply, divide

class TestCalculator:

    def test_add(self):
        assert add(2, 3) == 5

Для просмотра покрытия тестами нам нужно установить pytest-cov,расширение pytest для отчетов о покрытии, упомянуто ранее.

pip install pytest-cov

Запустите анализ покрытия следующим образом:

pytest --cov=calculator

Вывод показывает:

Name            Stmts   Miss  Cover
-----------------------------------
calculator.py      10      5    50%
-----------------------------------
TOTAL              10      5    50%

Вывод, показанный выше, показывает, что 5 из 10 операторов в calculator.py не выполнены, в результате чего достигается только 50% покрытие кода. для более крупного кода это станет серьезной проблемой и приведет к сдерживанию.

Теперь посмотрим, может ли cover-agent показать лучшее поведение.

Автоматизированные тесты с Cover-Agent

Для установки Codium’s Cover-Agent, следуйте этим шагам:

Первым делом, установите Cover-Agent:

pip install git+https://github.com/Codium-ai/cover-agent.git

Убедитесь, что ваш OPENAI_API_KEY установлен в ваших environment variables, так как он требуется для API OpenAI.

Потом, напишите команды для запуска тестов в терминале:

cover-agent \
--source-file-path "calculator.py" \
--test-file-path "tests/test_calculator.py" \
--code-coverage-report-path "coverage.xml" \
--test-command "pytest --cov=. --cov-report=xml --cov-report=term" \
--test-command-dir "./" \
--coverage-type "cobertura" \
--desired-coverage 80 \
--max-iterations 3 \
--openai-model "gpt-4o" \
--additional-instructions "Since I am using a test class, each line of code (including the first line) needs to be prepended with 4 whitespaces. This is extremely important to ensure that every line returned contains that 4 whitespace indent; otherwise, my code will not run."

Это генерирует следующий код:

import pytest
from calculator import add, subtract, multiply, divide

class TestCalculator:

    def test_add(self):
        assert(add(2, 3), 5

    def test_subtract(self):
        """
        Test subtracting two numbers.
        """
        assert subtract(5, 3) == 2
        assert subtract(3, 5) == -2

    def test_multiply(self):
        """
        Test multiplying two numbers.
        """
        assert multiply(2, 3) == 6
        assert multiply(-2, 3) == -6
        assert multiply(2, -3) == -6
        assert multiply(-2, -3) == 6

    def test_divide(self):
        """
        Test dividing two numbers.
        """
        assert divide(6, 3) == 2
        assert divide(-6, 3) == -2
        assert divide(6, -3) == -2
        assert divide(-6, -3) == 2

    def test_divide_by_zero(self):
        """
        Test dividing by zero, should raise ValueError.
        """
        with pytest.raises(ValueError, match="Cannot divide by zero"):
            divide(5, 0)

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

Теперь пришло время снова проверить покрытие:

pytest --cov=calculator

Выход:

Name            Stmts   Miss  Cover
-----------------------------------
calculator.py      10      0   100%
-----------------------------------
TOTAL              10      0   100%

В этом примере мы достигли 100% покрытия кода. Для более крупных баз кода процедура примерно такая же. Вы можете прочитать этот指南 для детального описания работы с более крупной базой кода.

虽然 Cover-Agent представляет собой значительный шаг вперед, важно отметить, что эта технология еще в своей ранней стадии. Persistent research and development are essential for further refinement and broader adoption, and CodiumAI invites you to contribute to this open source tool.

Преимущества Open Source Cover-Agent

Open source nature of Cover-Agent offers several advantages that should help propel the technology forward. Among them are:

  • Доступность: Open source nature enables LLM-based testing experimentation and is accessible to developers with various backgrounds. This will increase the number of users and lead to development of better technology and more applications..

  • Сотрудничество: Разработчики могут вносить свой вклад, предлагать улучшения, новые функции и сообщать о проблемах. Cover-Agent быстро растет и развивается в проект, идеально подходящий для разработчиков..
  • Прозрачность: Информация о внутренних операциях доступна, что способствует доверию и в конечном итоге увеличит потенциал технологии.

Кроме того, помимо преимуществ open-source, Cover-Agent предоставляет разработчикам собственный набор сильных преимуществ:

  • Простой доступ: Разработчики могут легко установить и экспериментировать с тестированием на основе LLM. Это позволяет непосредственно и быстро исследовать возможности технологии, при этом с минимальным или вовсе без прерывания их рабочего процесса.

  • Настройка по специфическим потребностям: Открытый исходный код Cover-Agent позволяет разработчикам адаптировать инструмент под свои специфические требования проекта. Это может включать модификацию используемой модели LLM, настройку тренировочных данных для лучшего отражения их кодовой базы или интеграцию Cover-Agent с существующими тестовыми рамками. Этот уровень настройки дает возможность разработчикам использовать силу тестирования на основе LLM так, что она соответствует их потребностям проекта.

  • Простая интеграция: Она легко интегрируется с VSCode (популярным редактором кода), что делает интеграцию с существующими рабочими процессами легкой. Вы также можете легко интегрировать ее с существующими написанными вручную тестами.

Как вы можете внести вклад в Cover-Agent?

Исходный код Cover-Agent доступен для всех пользователей через этот репозиторий GitHub. Они убеждают разработчиков всех профилей проверять их продукт и вносить вклад в дальнейшее улучшение и развитие этой новой технологии.

Заключение

Инструменты по улучшению тестирования на основе LLM (langauge learning model) обладают огромным потенциалом революционировать то, как разработчики приступают к тестированию модулей. Благодаря использованию мощных языковых моделей, специально тренированных на коде, эти инструменты могут упростить создание тестов, улучшить покрытие кода и, таким образом, повысить качество программного обеспечения.

В то время как исследования Meta с TestGen-LLM предлагают ценные Insights, недоступность публичного исходного кода препятствует широкому использованию и продолжению развития. К счастью, Cover-Agent предоставил готовую и настраиваемую решение. Он дает разработчикам возможность экспериментировать с тестированием на основе LLM и вносить вклад в его эволюцию.

Потенциал TestGen-LLM и Cover-Agent огромен, и дальнейшее развитие за счет вклада разработчиков приведет к революционному инструменту, который потребует переосмысления автоматизированного генерирования тестов наForever.

Соединитесь с мной на LinkedIn и Twitter, если это вам помогло.