TestNg запуск 10% тестов с рандомной выборкой

Погуглил немного. В доках random есть только для порядка тестов)

меня интересует запуск части тестов например 10% от всех
или например чтобы запускался рандомно 1 тест из каждого класса который заинклюдан в xml

Возможно есть инфа от других фреймворках который поддерживают подход таких запусков тестов?

а нельзя обернуть это в скрипт какой-нибудь?

мне кажется можно запараметризовть эти тесты и один из параметров использовать для включения ?

Конечно можно) я вот думаю что может уже что-то есть готовое - мои костыли вряд ли будут лучше.

Наверно реализовывать можно через кастомные лиснеры

  1. перехватывать в них методы которые инвокаются и запускать / отключать
  • но останутся издержки на запуск
  • не понятно как будут себя вести бефор методы в этом случае

Коробочная реализия - группы…
но это уныло делать 10 групп только для запусков и дёргать разные xml-ки

ПС бизнес кейс такой:

  • сервер слабый - параллелить тесты не вариант.
  • билдов много - за день все тесты в рандомном режиме прогонятся на 90%
  • такой пар вайзинг получится

А почему разные xml-ки? Разве в testng нельзя в одном файле создать несколько групп? Ну а группу тестов можно выбирать рандомно перед запуском тестов создав, например, groovy или python скрипт на ci.

И почему параллелить не вариант, outofmemory и сервер умирает? Хотя бы два потока пойдет?

@ VatslauX - преобразование из одного XML в XML это кажется задача решаемая многими способами напр. в контексте

https://maven.apache.org/guides/mini/guide-using-ant.html

покажите п-та свой суперхеви testng.xml из спортивного интереса любопытно …

Вот такой код с вероятностью 90% пропустит каждый тест кейс.
То есть с вероятностью 10% запустит каждый:

import org.testng.SkipException

@BeforeMethod
void beforeMethod(Method method)
{
     if (new Random().nextInt() % 10 != 0) {
            throw new SkipException ('skipping ' + method.toString());
     }
}

Если в некоторый случаях нужно запускать все тесты, то можно добавить параметр runAll (нужно его взять откуда-то - из конфига, environment …:

import org.testng.SkipException

@BeforeMethod
void beforeMethod(Method method)
{
     if (new Random().nextInt() % 10 != 0 & !runAll) {
            throw new SkipException ('skipping ' + method.toString());
     }
}
1 лайк

Похоже это удобный вариант. Спасибо
runAll тоже удобно - можно как параметр их xml передать

Загрузка по процессору во время рендеринга страниц под 90-100%
нет смысла параллелить

нет спасибо) хочу чтобы CI только дёргал xml и так осталось в будущем
максимально примитивно

ПС maven must die) Viva la Gradle

@VatslauX не понял в чем проблема всегда рисовать xml перед запуском gradle или mvn вы же не возражаете что код компилируется и "jar"ится…

1 лайк

@sergueik а вы используете Yaml вместо xml для testNg там вроде тоже просто небольшая генерация?

пока не использовал и небыл а курске что YAML проще - только если в vi крафтить тест конфигурации … бросьте ссылку (на работе и дел будет много
). спасибо.

как говорится но оффенз просто правда в нек странах каникул после нг нету

http://testng.org/doc/documentation-main.html#yaml
сначала подумал что из коробки поддержка, но дочитал до конца - через генерацию xml - решил забить на это

PP даже замутил датапровайдер на ямле
http://paypal.github.io/SeLion/html/java-docs/1.0.0/dataproviders-apis/index.html?com/paypal/selion/platform/dataprovider/impl/YamlDataProviderImpl.html

@VatslauX
спасибо
у меня тожеесть на уямле

DataSourceSingleton.java
DataSourceStatic.java

1 лайк

Матерь-василиса. Что это страницы такие. Мы вроде бы не в 2000-м году :laughing:

@ VatslauX учтите если в самом деле собираетесь делать путем TestNg запуск 10% тестов с рандомной выборкой - #7 от пользователя SlavikF то там все немного не так просто … для 6.14.3 по крайней мере

1 лайк

я тут посмотрел что происходит после швыряния org.testng.SkipException - получился проектик на гитхабе - GitHub - sergueik/testng_random_set_test_picker: TestNg subset randomized class/method picker

1 лайк

супер! спасибо гляну как оно

Самая примитивная реализация чистыми средствами TestNG + Java 8:

public class MethodInterceptor implements IMethodInterceptor {

    @Override
    public List<IMethodInstance> intercept(List<IMethodInstance> methods, ITestContext context) {
        Collections.shuffle(methods);
        long sizeLimit = (long) Math.ceil(methods.size() * 0.1);
        return methods.stream().limit(sizeLimit).collect(toList());
    }
}