Статьи

Java Bullshifier — Генерация массивных случайных кодовых баз

Инструмент командной строки для генерации массивных случайных Java-приложений

Инструмент командной строки, который вы так долго ждали. Или нет. В конце концов, это довольно эзотерично. В любом случае, это довольно полезно для некоторых, и забавная утилита для других. Bullshifier — это внутренний инструмент OverOps, разработанный Дэвидом Леваноном и Hodaya Gamliel . Он используется для того, чтобы протестировать некоторые из наших возможностей мониторинга на смехотворно больших базах кода, с транзакциями, которые проходят тысячи вызовов, более тысячи классов и заканчиваются исключениями.

Давайте разберемся, как его использовать и почему мы его создали.

Некоторая мотивация

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

Он создан для производства и требует низких накладных расходов, которые никогда не превышают 3% с точки зрения использования процессора и памяти. Таким образом, как часть нашего процесса, нам нужно было протестировать его с некоторыми крайними крайними случаями — вот где приходит Bullshifier:

  • Создает массивные проекты с тоннами кода и журналирования
  • Работает с методами с глубокими стеками вызовов
  • Выдает исключения, вызванные состоянием случайной величины

Основное использование

Требования

  • Groovy установлен
  • Java установлена

Установка

  • Скачайте, распакуйте, и вы готовы к работе

Запустить настройки

  • ./gradlew run (Параметры по умолчанию, генерирует один jar с 10 классами)
  • вывод cd && gradle fatJar для создания сгенерированного проекта
  • java -cp output / build / libs / tester.jar helpers.Main для его запуска

Или вы можете просто запустить ./scripts/small.sh или ./scripts/big.sh с предварительно настроенными параметрами запуска.

Флаги

  • -Poutput-directory (Относительный путь к выходному каталогу)
  • -Poutput-classes (количество генерируемых классов)
  • -Подпроекты (количество банок для генерации)

Имейте в виду, что создание более 500 классов займет довольно много времени. Наше самое большое количество пробежек составило 20 000 классов, но лучше не превышать 5000.

Запуск подпроектов

  • / gradle build (получить файл WAR)
  • Перейти в корзину
  • Сценарий оболочки создается для каждого проекта, root запустит их все

Расширенный конфиг

Есть несколько дополнительных опций, которые дают вам точный контроль над сгенерированным кодом, но вы можете испортить его и использовать на свой страх и риск:

  • Конфигурация низкого уровня: src / main / groovy / generator / Config.groovy
  • Конфигурация более высокого уровня доступна в выходной папке. Есть больше опций для добавления регистрации и точной настройки поведения приложения, но на данный момент это экспериментально.

Если вы хотите узнать больше, не стесняйтесь обратиться или попросите нас в разделе комментариев для более глубокого прохождения. Настройки по умолчанию — не журналы, а исключение для каждого 10-го кадра в стеке вызовов.

Образец вывода

Забавно, что сначала все эти случайно сгенерированные имена классов и переменных вызывали множество обращений с зарезервированными словами. Несмотря на то, что они абсолютно случайны, из-за огромного количества сгенерированного кода. Так что теперь это случайный минус зарезервированные слова & # 55357; & # 56859;

Каждый сгенерированный метод содержит 4 раздела:

  • Определение переменной со случайными типами, случайными именами и значениями.
  • Раздел выдает исключения или печатает в журнал, в соответствии с настройками конфигурации для скорости событий. Это также включает в себя функцию «самоубийства», которая останавливает выполнение программы.
  • Вызывает следующий режим.
  • Код, который никогда не запускается.

Вот случайный фрагмент из первой части:

1
2
3
4
5
6
7
8
int methodId = 2;
Object[] root = new Object[9];
List<Object> valCjrukeawxor = new LinkedList<Object>();
Set<Object> valRvshucjormy = new HashSet<Object>();
boolean valSboiogeldpb = true;
 
valRvshucjormy.add(valSboiogeldpb);
boolean valPjvoucyfprv = true;

Посетите сайт, чтобы загрузить пример результата или просмотреть на GitHub .