UTBot - UnitTestBot is the tool for automated unit test generation and precise code analysis.
cyber-utbot-api - обёртка над utbot, позволяющая запускать его из кода.
Она работает по аналогии с utbot-cli, в ней отдельно вынесены настройки для cli, можно задать настройки самого utbot внутри.
Основная функциональность: генерирует тесты для уязвимостей (какие именно зависит от базы знаний), работает аккуратнее и лучше в некоторых специфичных местах (например есть встроенная улучшенная поддержка javax.servlet)
Следующее работало с версией gradle 7.2, с более старыми версиями не проверялось, может что-то не собраться.
git clone https://github.com/UnitTestBot/UTBotJava
cd UTBotJava/
git checkout fe0b89c789da5559bf8912e0179cdcee026e6137
git clone https://github.com/cyberok-org/cyber-utbot-api
cd cyber-utbot-api/После стоит открыть ide (на проекте cyber-utbot-api) и попытаться собрать (gradle build -x test если не начнётся автоматически). Потом применить patch командной ниже и ещё раз собрать.
cd scripts/
bash patch_apply.shДальше всё собирается командой (есть внутренние тесты для примеров которые и должны падать)
gradle build -x test(Возможно нужно будет предварительно сконфигурировать проект (load gradle changes, если будет иконка справа сверху))
Для проекта есть база знаний (приватная), её можно тоже склонировать, если есть доступ (cyber-utbot-exploit-base).
Запустить main в Simple.
Simple - main с которого можно из кода запускать utbot (упрощенный, для демонстрации)
VulnerabilityChecker - тот же пример что и в Simple с использованием extraVulnerabilityChecks и явным заданием базы знаний из кода.
Application - main с которого можно из кода запускать utbot.
ReportCreator - заготовка для запуска бенчмарков.
Generator, ConstraintsViewer - Другой способ, возможно более удобный, делать это через тесты.
Запуск в общем случае:
-
Предварительно стоит добавить эти VM options в конфигурацию запуска.
-Xmx1536M --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.nio.file=ALL-UNNAMED --add-opens java.base/sun.nio.fs=ALL-UNNAMED --add-opens java.base/java.nio.file.spi=ALL-UNNAMED --add-opens java.desktop/sun.awt=ALL-UNNAMED --add-opens java.base/java.nio.charset=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.ref=ALL-UNNAMED --add-opens java.base/java.lang.invoke=ALL-UNNAMED --add-opens java.base/sun.security.util=ALL-UNNAMED --add-opens java.logging/java.util.logging=ALL-UNNAMED --add-opens java.base/java.util.concurrent.locks=ALL-UNNAMED --add-opens java.base/java.net=ALL-UNNAMED --add-opens java.base/sun.util.calendar=ALL-UNNAMED --add-exports=java.base/sun.nio.ch=ALL-UNNAMED --add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED --add-exports=java.base/sun.nio.ch=ALL-UNNAMED --add-exports=java.base/sun.nio.fs=ALL-UNNAMED --add-exports=java.base/sun.nio.cs=ALL-UNNAMED -
Заменить переменную classpath (там должен быть
buildтекущего проекта (build/classes/java/main),buildтестируемого проекта (например /home/andrew/ex/build/classes/java/main) и пути до нужныхjar(например /home/andrew/.jdks/openjdk-17.0.2/bin/javax.servlet-api-3.1.0.jar)) -
Выбрать нужную базу и задать настройки. В настройках запуска - классе
GenerateTestsSettingsможно указать путь до базы знаний вvulnerabilityCheckDirectories. Application настроен на (cyber-utbot-exploit-base). Дефолтно задана база для примера -
Запустить (например Application)
Подробнее про формат проверок можно почитать тут
Так же можно собрать cli и использовать его. Это можно сделать командой gradle jar.
Замечание: не стоит запускать на файлах, пути которых полностью совпадают с путями из этого репозитория (баг). Это выдаёт подобную ошибку java.lang.Exception: Error: The path '/home/andrew/UTBot/UTBotJava/cyber-utbot-api/file:/home/andrew/UTBot/UTBotJava/cyber-utbot-api/build/libs/cyber-utbot-api-2023.05-SNAPSHOT.jar!' is neither file nor directory
brief - доки по всему. Там есть описания для:
cyberok.api- доки по настройкам, стандарту базы знаний и механизму проверки.cyberok.test- доки по спецификации тестов (формат хранения), концепция приложения для сравнения разных инструментов/версий одного инструмента.utbot- внутренние доки поutbot, utbot scheme - схема работыutbotabstract- что-то отдельное, не относящаяся к теме, но полезное при изучении.
testcases - папка с примерами (запускается на utbot).
test - папка с результатами запуска тестов.
testcasesGen - папка c примерами в предполагаемом формате хранения. Спецификация формата хранения - test format (текущие примеры пока не удовлетворяют требованием спецификации).