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

testng
Теги: #<Tag:0x00007f7b6233dc38>

(Vatslau) #1

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

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

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


(Vladislav Abramov) #2

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


(Сергей Кузьмин) #3

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


(Vatslau) #4

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

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

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

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

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

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

#5

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

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


(Сергей Кузьмин) #6

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

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

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


(SlavikF) #7

Вот такой код с вероятностью 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());
     }
}

(Vatslau) #8

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


(Vatslau) #9

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


(Vatslau) #10

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

ПС maven must die) Viva la Gradle


(Сергей Кузьмин) #11

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


(Vatslau) #12

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


(Сергей Кузьмин) #13

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

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


(Vatslau) #14

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


(Сергей Кузьмин) #15

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

DataSourceSingleton.java
DataSourceStatic.java


#16

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


(Сергей Кузьмин) #17

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


(Сергей Кузьмин) #18

я тут посмотрел что происходит после швыряния org.testng.SkipException - получился проектик на гитхабе - https://github.com/sergueik/testng_random_set_test_picker


(Vatslau) #19

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


(Sergey Korol) #20

Самая примитивная реализация чистыми средствами 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());
    }
}