Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

Bug в TestNG или в этом есть какая-то логика?

maven
java
testng
Теги: #<Tag:0x00007fedb85622c0> #<Tag:0x00007fedb8562180> #<Tag:0x00007fedb8562040>

(Oleksandr Molodetskyi) #1

Экспериментировал с аннотациями в TestNG и натолкнулся на интересную проблему с аннотацией AfterGroups.
Мой testng.xml сконфигурирован таким образом:

<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite"> <!-- Suite -->
	<test name="Suite Test1"> <!-- Test -->
     <groups>
     <run>
     <include name="japan" />
     <include name="auto" />
     <exclude name="russian" />
     </run>
     </groups>
		<classes>
			<class name="groups_samples.GroupsTest" /><!-- Class -->
		</classes>
	</test><!-- Test -->
</suite> <!-- Suite -->

мой тест выглядит так:

package groups_samples;

import org.testng.Assert;
import org.testng.annotations.AfterGroups;
import org.testng.annotations.BeforeGroups;
import org.testng.annotations.Test;

public class GroupsTest {
	@BeforeGroups(groups = { "auto" })
	public void setUp() {
		System.out.println("BeforeGroups. It's running before groups");
	}

	@AfterGroups(groups = { "auto" })
	public void cleanUp() {
		System.out.println("AfterGroups. It's running after groups");
	}

	@Test(groups = { "auto", "german" })
	public void BMW() {
		System.out.println("BMW");
	}

	@Test(groups = { "auto", "german" })
	public void VW() {
		System.out.println("VW");
	}

	@Test(groups = { "auto", "japan" })
	public void Nissan() {
		System.out.println("Nissan");
	}

	@Test(groups = { "german" })
	public void Bretzel() {
		System.out.println("Bretzel");
	}

	@Test(groups = { "japan" })
	public void Sushi() {
		System.out.println("Sushi");
		Assert.assertTrue(false);
	}

	@Test(groups = { "auto" }, dependsOnGroups = { "japan" })
	public void Kia() {
		System.out.println("Kia");
	}

	@Test(groups = { "auto" })
	public void Hundai() {
		System.out.println("Hundai");
	}

	@Test(groups = { "auto", "russian" })
	public void Lada() {
		System.out.println("Lada");
	}
}

идея в том, что должны раниться группы методов auto и japan, при этом если метод из группы russian то он не должен раниться. Один метод (Kia) зависит от группы japan - если хоть один метод из группы japan зафейлился, то он должен скипаться.
Эта часть работает как ожидается.
Но я еще добавил аннотации @BeforeGroups(groups = { "auto" }) и @AfterGroups(groups = { "auto" })
Так вот почему-то AfterGroups не ранится, хотя запускаются 5 тестов из этой группы и один скипается. Методом эксперимента удалось выяснить что AfterGroups не ранится если один из тестов той группы для которой он предназначен скипается. Я не вижу логики в этом - для меня похоже на баг. Кто-то может пояснить, почему не ранить AfterGroups в случае, если скипнулся один из тестов этой группы(не все!)


(vmaximv) #2

(Oleksandr Molodetskyi) #3

аха-ха-ха, все же дефект. Значит моя тестинг карма продолжает действовать. Странно, что они его так и не исправили с 2012-го года


(Oleksandr Molodetskyi) #4

Еще интересная штука - тоже похожая на баг - если есть тест метод, который dependsOnMethods на метод который фейлится, но у него стоит alwaysRun=true и стоит priority=какому-либо не последнему приоритету, то он ранится последним. Кажется, что TestNG имеет такую логику по тестам - сначала проходит по тестам по приоритету, но скипает те тесты, которые должны скипаться. потом проверяет есть ли среди тех что скипнулись тесты с аннотацией alwaysRun=true и ранит их. И поэтому они ранятся в самом конце, несмотря на приоритет