Пауза и принудительная остановка тестов Selenide/testng

Здравствуйте.

Гуглил сей вопрос, и находил только темы , вида “как поставить временную задержку в тестах”
, с ответами, вида: Thread.sleep(ms) и тд.
Но мой вопрос : Как приостановить выполнение запущенного testng suite, и продолжить выполнение тестов (по требованию). А так же - как совсем прервать выполнение (STOP).

Что пытался делать:
Создавать процесс, внутри которого запускается testng.run()
и управлять этим процессом

	public static final Object pauseLock = new Object();
	public static volatile boolean paused = false;
	public static volatile boolean running = false;

	private static volatile TestNGRunner testng;

        public void runTests() {

            if (!running) {
			running = true;

			startButton.setText(" ■ Стоп");

			runnerThread = new Thread("TestRunner-Thread") {
				@Override
				public void run() {
					while (running) {
						synchronized (pauseLock) {
							if (!running) { 
								break;
							}
							if (paused) {
								try {
									synchronized (pauseLock) {
										pauseLock.wait(); 
									}
								} catch (InterruptedException ex) {
									break;
								}
								if (!running) { // running might have changed since we paused
									break;
								}
							}
						} //sync pause
						try {
						testng = new TestNGRunner();

						List<String> suites = new ArrayList<String>();
						suites.add(...... );
						suites.add(...... );
						testng.setTestSuites(suites);
						testng.initializeSuitesAndJarFile();

						testng.run();
						} catch (Exception e) { ...}
						} finally { ....}
}

					} //while

				} //run ()

			}; //runnerThread

			running = true;
			runnerThread.start();
} else

		{
			stop();

			startButton.setText(" ► Запуск");

			WebDriverRunner.getWebDriver().close();
			WebDriverRunner.getWebDriver().quit();

		}


public void stop() {
		running = false;
		runnerThread.interrupt();
	}

	public void pauseResume() {
		synchronized (pauseLock) {
			paused = !paused;
			pauseButton.setText(paused ? " ↻ Продолжить" : " ⌷⌷ Пауза ");
			System.out.println("Pause is : " + paused);

			pauseLock.notifyAll();
		}
	}

Но я так понимаю - запущенный инстанс testng.run() - это как отдельный процесс, который не слушается моих команд, потому что я отдаю их не тому процессу.

Так же я не увидел у класса testng имплементации Runnable, или каких то методов как остановить процесс выполнения тестов или поставить их на паузу.

Если кто то разбирается в этой теме, прошу подсказать, как это решается.

Что же вы курите-то там?
Зачем весь этот код? Для чего надо кликать кнопку?
В наше время никто так тесты не запускают. Надо просто запустить mvn test или gradle test, и всё.

1 лайк

Наверно, пилят свою какую-то графическую надстройку для запуска тестов.

1 лайк

сразу видно, что люди там далеки от тестирования :smiley:
логичнее ведь не с процессами на тачке, где тесты идут, работать, а просто максимально ускорить прохождение тестов, а кнопочку сделать поверх api-запроса в jenkins, gitlab etc., чтобы нажал и уже минут через 10 у тебя отчет

Мне сказали что задача должна выполнится именно так, я её и пытаюсь сделать именно так :slight_smile:

Да, вы правы, я новичок в этой сфере. (в программировании и тестировании)
Хотя и чувствовал, что это какое то колхозное решение, далеко от реальных решений тестировщиков профессионалов .

У нас нет Jenkis или подобных систем.
Да, сначала я запускал тесты через батники:

mvn clean test -DTestNGFile=regres6.xml & start notepad %LOGFILE% &  %projectLocation%\..\allure\bin\allure serve %projectLocation%\allure-results

Потом мне сказали - надо сделать красиво, с кнопочками и возможностью управлять процессами остановки и запуска.

так вы подойдите к тем, кто вам задачу поставил, и объясните, что это не просто колхоз, а абсолютная бессмыслица и вот почему:

  • влиять на процесс прохождения тестов - значит терять контроль качества. подумайте сами, что если запустить тесты сейчас, поставить на паузу, обновить приложение, и продолжить тесты через неделю, например?
  • как только появится кнопка паузы, ей захочется пользоваться. в том плане что триггер тестов если произошёл, то тесты либо должны дойти до конца, либо выключиться и всё, только полный перезапуск

ну и вообще, у вас реально нету никакого ci? вы точно в нормальной конторе работаете? кто вообще в 2к20 ставит задачу делать красиво через какие-то свои кнопочки? я бы на вашем месте лыжи-то подмазывал

1 лайк

Попробуйте выяснить какова практическая цель остановки сьюта посреди рана. Боюсь без этого вам никто толком не поможет, так как скорее всего именно так никто не делал в своих проектах ибо не имеет практического смысла.
Я могу предположить что цель запустить и посмотреть что первые тесты пробежали значит можем дальше бежать длинный сьют, но таким образом это не делается.
Ну или вам просто дали какоето тестовое задание, странное, но хотят посмотреть как вы будете мыслить.

Пс. Для того чтобы красиво запускать через кнопочку это делается через jenkins, gitLab или любую другую CI систему.

1 лайк

Благодарю за ответ!

Ладно, фиг с ней с паузой. Но я так и не понял как остановить процесс tesng.run() программно.
Только тупо закрывая браузер, после чего тесты начинают валится в ошибку.

После такой манипуляции ещё и в памяти остаётся висеть webdriver…

Так, наверно и никак. Потому что это не предполагается в тестНГ.
Тогда вы уж должны просто послать сигнал на закрытие браузера, кильнуть драйвер.
И ваш фреймворк просто должен корректно отработать эту ситуацию - т.е. просто прекратить дальше запускать тесты (т.к. браузер упал), а это делает сам ТестНГ, но он не сможет это сделать, т.к. вы его пытаетесь вырубить. Т.к. не смогут отработать всякие @After после теста.
Прекратите городит огород. Распечатайте этот тред и покажите заказчику. Пусть он прочитает, что специалисты советуют внедрить CI систему.

1 лайк

Иван, хочу уточнить: это не ваше решение колхозное, это постановка задачи колхозная.
Не воспринимайте этот поток критики в комментариях лично на свой счёт.

2 лайка