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 - схема работыutbot
abstract
- что-то отдельное, не относящаяся к теме, но полезное при изучении.
testcases - папка с примерами (запускается на utbot
).
test - папка с результатами запуска тестов.
testcasesGen - папка c примерами в предполагаемом формате хранения. Спецификация формата хранения - test format (текущие примеры пока не удовлетворяют требованием спецификации).