TestNG тестілеу сабақтарына аралық жолақты емес, дәйекті түрде әдістерді іске қосатынына қалай көз жеткізуге болады?

Жағдай мен проблема

Менде әртүрлі сынақ әдістерімен бірнеше сынақ сабақтары бар. Барлық сынақтар фонда бірдей сынақ дерекқорын пайдаланады. Әрбір сынақ класы дерекқордың мазмұнын инициализациялайды, содан кейін бірнеше сынақ әдістерінде заттарды тексереді.

Әрбір сынақты жеке-жеке өткізгенде, бәрі өтеді. Бірақ бір мезгілде бірнеше тестілеуді өткізсем (немесе maven немесе IDE, IntelliJ пайдалану арқылы), әртүрлі сынақ сабақтарының әдістері интервалдан өтеді, мысалы. бірінші сынып басталғаннан кейін екінші сыныптың дерекқорын инициализациялау іске қосылды, бірақ бірінші сыныптың барлық сынақ әдістері іске қосылмай тұрып, бұл әдістер орындалмай қалады (дерекқорда қазірдің өзінде екінші класс деректері бар).

Мен тырысып көрген кейбір нәрселер және кейбір қосымша мәліметтер

Ең қарапайым шешім TestNG жүгірткісін сабақтарды дәйекті түрде іске қосу үшін мәжбүрлейді (яғни, сынақ класының барлық сынақ әдістерін басқа класстың сынақ әдістерін іске қосу алдында аяқтау үшін күтіңіз). Мұны істеу мүмкін бе?

Мүмкін, бұл әр сыныпты бөлмемде бөлек сынақ ретінде көрсету арқылы жасай аламын, бірақ мен мұны істегім келмейді, себебі мен сыныбын қосып, қателесіп, қате жіберген кезде, люкске бір нәрсе қосуым керек дегенді білдіреді -прон.

TestNG-ді ештеңеге параллелизациялауды сұрамау (мысалы, жіптің санына 1-ге тең немесе параллель жұмыс істемеуді болдырмау) мұнда көмектеспейді, себебі әдістер дұрыс емес тәртіпте іске қосылады (бір мезгілде емес).

Әрбір сынақ класы үшін әртүрлі дерекқорды пайдалану бір нұсқасы болады, бірақ мен мұны оңай жолмен көрмеймін (JPA және Guice арқылы).

Мен қазіргі уақытта DBUnit, Unitings және т.б. пайдаланбаймын; Мен бұл құралдарды өте жақсы білмеймін, бірақ менің проблемамды шешпейтін әсер қалдырды.

JPA-ды әр сынақ сыныбында дерекқорды инициализациялау үшін қолданамын (яғни, нысан нысандарын жасаңыз және оларды басып шығарыңыз).

11
Менің ойымша, мәселенің кем дегенде бөлігі - бірнеше сыныптың testPrepareDb деп аталатын әдістер және @Test (dependsOnMethods = «testPrepareDb») деген басқа әдістер. Бірнеше сынақ бір сынақтың бөлігі ретінде іске қосылғанда, барлық тәуелді әдістер тек барлық testPrepareDb әдістерінің іске қосылғаннан кейін ғана іске қосылады, бұл менің жағдайда дұрыс емес. Негізінде, менің сынақ сабақтарым класстағы xml-дегі кодты ретінде айқындамай, автоматты түрде TestNG сынақтарын бөлуге аударуды қалаймын.
қосылды автор mazi, көзі

7 жауаптар

Even in sequential mode TestNG could interleave test methods from the same suite. It does guarantee the sequence @BeforeClass -> @Test -> @AfterClass but it can do something like:

before class1
    test class1.method1
before class2
    test class2.method1
    test class1.method2
after class1
    test class2.method2
after class2

Шешім әр сыныпты басқа жиынтыққа мәжбүрлеу болып табылады (олар шынымен дәйекті орындалады). 2.16 нұсқасына сәйкес, maven сенімділік плагині әр сыныпты бөлек жиынтыққа қойып, мәселе шешілді.

Екінші жағынан, IDEA (тіпті ең соңғы 13 EAP) бір жиынтықтағы барлық сыныптармен бірге xml файлын шығарады. Үміттеніп, IDEA бұл мәселені шешіп, оны түзетеді. Interleaved tests - деректер қорлары сияқты ортақ ресурстармен жұмыс істегенде, шоу-роботтар.

5
қосылды
Арнайы конфигурация қажет емес. Мен осындай XML-ны немесе ондай нәрсені қолданбаймын. Мен сенімді файл конфигурациясында файл үлгілерін ғана көрсетемін. UPDATE: Мен сабақтарды жүйелі түрде орындауға және барлық нәрсені түбірте түзетуге арналған тесттен өтіп үлгердім, бірақ ол сұранысқа дайын емес.
қосылды автор Bogdan Calmac, көзі
Бұл мен үшін де жұмыс істемейді және мен сенімді қорғауды қолданамын 2.17. Менің ойымша, мәселе @mazi өз түсініктемесінде өзінің бастапқы сұрағына төменде сипатталғандай болуы мүмкін - егер сізде бірдей атпен, тіпті әртүрлі сыныптарда бірнеше әдіс бар болса және олардың біреуіне байланысты болсаңыз, TestNG бұл ақпаратты барлық тәуелділік ретінде қарастырады олар. Бұл, менің ойымша, мен өзімнің барлық өзара тәуелді әдістерімді бірге айналдырып, әрі қарай зерттеу үшін уақытты жоғалтып алдым.
қосылды автор Dan King, көзі
Жаңа мүмкіндіктің 2.16 нұсқасындағы кеңестеріңіз үшін рақмет! Мен оны жұмыс істеуге үйрететін сияқты емеспін; кейбір арнайы конфигурация қажет пе? Параллельді пара-парақтар құжаттар маңызды емес (және, әрине, JUnit үшін көрінеді).
қосылды автор mazi, көзі

TestNG бірнеше параллельді стратегияларды ұсынады. methods сіздің мұқтаждарыңыз үшін тым агрессивті көрінеді, бірақ classes немесе datasets көрінген бе?

1
қосылды
Мультимедиялық есептеуді қажет етпейді, өйткені сіз қажет стратегия - «бірдей классқа тиесілі болғанша параллельді әдістерді іске қосу». Ол қол жетімді емес.
қосылды автор patrungel, көзі
Бұған дейін false деп көргім келді; енді methods , classes және tests де ( даналар ) жарамды опция сияқты көрінбейді. Жоқ көмек. Мен жазғанымдай, бұл мәселе параллелиза емес, тапсырыс беру.
қосылды автор mazi, көзі

Осындай проблемамен осында келді. Менің ойымша, group-by-instances = «true» шешім болуы мүмкін.

0
қосылды

Мен TestNG-тегі тестілеудің кейбір әдістерін талқылайтын мақаланы жаздым:

http://ancient-marinator.blogspot.com /2013/05/on-testing-scheduling-your-tests.html

Naturally, the best source for information is at home: http://testng.org/doc/index.html

0
қосылды
TestNG-да қолдануға арналған жалғыз тапсырыс беру - бірінші сыныптың басында @Test (groups = «test1») қойыңыз, @Test (groups = «test2», dependsOnGroups = «test1») және т.б. Бұл жүйе бойынша жұмыс істей бастайды.
қосылды автор Bob Dalgleish, көзі
@BobDalgleish - бірақ бұл сіздің барлық сынақтарды топтарға қою керек дегенді білдіреді. Ең бастысы, бұл сонымен қатар басқа класссыз орындалмай-ақ, өзіңіздің сыныптарыңызда бір сыныпты іске асыра алмайтыныңызды білдіреді.
қосылды автор Dan King, көзі
Рахмет, бұл жақсы блог парағы. Бұл өте жалпы және менің жеке проблемамды шешпейді.
қосылды автор mazi, көзі

We were running into this same issue, most people say it's caused by using dependsOn, but our solution was just setting priorities at a test level for some of our tests. I set up a Test Listener to re-prioritize our tests so that they run in the correct order. This is based on saberduck's solution in https://github.com/cbeust/testng/issues/106

Бұл шешім сынақ басымдылығын сыныптық басымдыққа келтіру арқылы сақтайды.

package testng_Listeners;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.HashMap;
import org.testng.IAnnotationTransformer;
import org.testng.Reporter;
import org.testng.annotations.ITestAnnotation;

//Listener to fix TestNG Interleaving issue. I had to re-write this as the original example I had did not allow for priority to be manually set on a test level.
public class RePrioritizingListener implements IAnnotationTransformer {

HashMap priorityMap = new HashMap(); Integer class_priorityCounter = 10000; // The length of the final priority assigned to each method. Integer max_testpriorityLength = 4; @Override public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod) { // class of the test method. Class<?> declaringClass = testMethod.getDeclaringClass(); // Current priority of the test assigned at the test method. Integer test_priority = annotation.getPriority(); // Current class priority. Integer current_ClassPriority = priorityMap.get(declaringClass); if (current_ClassPriority == null) { current_ClassPriority = class_priorityCounter++; priorityMap.put(declaringClass, current_ClassPriority); } String concatenatedPriority = test_priority.toString(); // Adds 0's to start of this number. while (concatenatedPriority.length() < max_testpriorityLength) { concatenatedPriority = "0" + concatenatedPriority; } // Concatenates our class counter to the test level priority (example // for test with a priority of 1: 1000100001; same test class with a // priority of 2: 1000100002; next class with a priority of 1. 1000200001) concatenatedPriority = current_ClassPriority.toString() + concatenatedPriority; //Sets the new priority to the test method. annotation.setPriority(Integer.parseInt(concatenatedPriority)); String printText = testMethod.getName() + " Priority = " + concatenatedPriority; Reporter.log(printText); System.out.println(printText); } } 

Тыңдаушыны testng.xml файлына қосуыңыз керек





0
қосылды

Тапсырысты басқару үшін әдістерін қабылдағыштарды (= пайдаланушы жазыңыз және қосыңыз) пайдаланыңыз.

Сондай-ақ, әрбір класс өз дерекқорының құм жәшігін қолдануы мүмкін: әрбір сынақ класын транзакцияға орап қою көмектесуі мүмкін.

Әрбір класс үшін орнатылған кестелер/дБ үшін жеке жұрнақ болуы сіздің тестілеу әдістеріңізді параллельде жүргізуге мүмкіндік береді (менің ойымша алғашқы екі нұсқасы болмайды).

0
қосылды

Мен dependOnGroups-ты сынып деңгейінде пайдаланбайтынмын, себебі кез-келген сынақ әдісі, егер сіз кез-келген сыныпта жұмыс істемей қалса, ол сіздің сыныпты іске қоспай-ақ қояды ... Бұл 'dependOn' топтарын пайдаланудың нақты төмендеуі ( немесе әдістер). Мен алдымен сыныптың деңгейінде @Test (group = thisClassName) параметрін орнатып көргім келеді, содан кейін testng.xml файлындағы сынақ белгісімен сыныпты анықтаңыз. Содан соң, осы сынақтардың тізімі ретінде кластың классификациясын реттеңіз. Сондай-ақ, xml-де келесі жоғары деңгейдегі тегте PreserveOrder = «True» орнату қажет болуы мүмкін деп есептеймін. Мен тәуелділікке қажет болған жағдайды қоспағанда, тәуелділікті пайдаланудан аулақ боламын, бірақ бұйрықты бақылау үшін емес. Бұл көмектеседі деп үміттенемін. -JR

0
қосылды