Мне часто нужно делать точно такую же задачу. Fuzz-тестирование является подходящим подходом, хотя мы должны быть осторожны, чтобы различать необработанные fuzzers и smart fuzzers.Умный фаззер отличается от обычного инструмента фазз (например, zzuf ) тем, что он генерирует данные, предназначенные для вашего приложения.Очевидно, что в этом случае вам понадобится умный фаззер.
Чтобы написать умный фаззер, вам нужно извлечь те правила, которые представляют «непротиворечивые и связные», и использовать их в качестве логики.Наверное, лучше всего привести пример.Класс Model
ниже имеет некоторую логику против него.
class Model {
// Should always be between 0 and 10
int a;
// Children
List<Model> children;
// Only true at the root
boolean isRoot;
}
Мы можем написать для этого построитель тестовых данных, просто кодифицировав эти правила.
class ModelGenerator {
private Random random;
// A seed is a good idea; you want your tests to be reproducible
public ModelGenerator(int seed) {
random = new Random(seed);
}
public Model arbitrary () {
return generateSingleItem(true);
}
private Model generateSingleItem(boolean isRoot) {
Model model = new Model();
model.isRoot = isRoot;
model.a = random.nextInt(10);
int childrenCount = random.nextInt(100);
model.children = new ArrayList<Model>(childrenCount);
for (int i=0;i<childrenCount;++i) {
model.children.add(generateSingleItem(false));
}
return model;
}
}
Теперь вы можете использоватьГенератор для создания случайных (но предсказуемых благодаря начальным) моделей для проверки утверждений с помощью.
Этот подход очень тесно связан с QuickCheck .Доступна Java-версия , которая обеспечивает общий интерфейс (и даже больше!), Как описано выше.