Pot specifica un grup la nivel de clasă pe un test de testare TestNG?

Am o clasă de bază care reprezintă un test de bază de date în TestNG și vreau să precizez că toate clasele care se extind din această clasă sunt de grup "db-test", totuși am constatat că acest lucru nu pare posibil. Am incercat adnotarea @Test:

@Test(groups = { "db-test" })
public class DBTestBase {
}

Cu toate acestea, acest lucru nu funcționează deoarece adnotarea @Test va încerca să facă o grămadă de metode în teste, iar avertismentele/erorile apar în eclipsă atunci când sunt executate testele.

Așa că am încercat să dezactivez testul, deci cel puțin grupurile sunt atribuite:

@Test(enabled = false, groups = { "db-test" })
public class DBTestBase {
}

dar atunci orice @BeforeTest (și alte adnotări similare), de asemenea, să fie dezactivat ... ceea ce, desigur, nu este ceea ce vreau.

Aș dori un mod de a adnota o clasă ca fiind de un anumit tip de grup, dar nu pare destul de posibil în TestNG. Are cineva alte idei?

0
fr hi bn
Doar am adăugat o soluție posibilă problemei Grupului TestNG "la nivel de clasă". Puteți să-l verificați și să-mi spuneți dacă merge în direcția cea bună?
adăugat autor VonC, sursa

5 răspunsuri

Nu sunt sigur cum funcționează moștenirea adnotărilor pentru TestNG, dar acest articol poate fi de folos. http://beust.com/weblog/archives/000170.html .

De fapt, acest lucru poate ajuta la îmbunătățirea http://testng.org/doc/documentation-main. html # adnotations , uitați-vă la grupurile de mostenire.

0
adăugat

Mi se pare ca fiind următoarea cod provocare (postare wiki comunitară):

Cum se poate executa toate metodele de testare a clasei extinse din grupul "aGlobalGroup" fără:

  • specificând grupul "aGlobalGroup" din clasa extinsă?
  • testarea metodelor publice non-adnotate de clasă extinsă?

The first answer is easy:
add a class TestNG(groups = { "aGlobalGroup" }) on the Base class level

Acest grup se va aplica tuturor metodelor publice atât din clasa de bază, cât și din clasa extinsă.

DAR: în acest grup vor fi incluse chiar metode publice care nu sunt testate (fără adnotări TestNG).

CHALLENGE: evitați includerea acelor metode non-TestNG.

@Test(groups = { "aGlobalGroup" })
public class Base {

    /**
     * 
     */
    @BeforeClass
     public final void setUp() {
           System.out.println("Base class: @BeforeClass");
     }


    /**
     * Test not part a 'aGlobalGroup', but still included in that group due to the class annotation. 
* Will be executed even if the TestNG class tested is a sub-class. */ @Test(groups = { "aLocalGroup" }) public final void aFastTest() { System.out.println("Base class: Fast test"); } /** * Test not part a 'aGlobalGroup', but still included in that group due to the class annotation.
* Will be executed even if the TestNG class tested is a sub-class. */ @Test(groups = { "aLocalGroup" }) public final void aSlowTest() { System.out.println("Base class: Slow test"); //throw new IllegalArgumentException("oups"); } /** * Should not be executed.
* Yet the global annotation Test on the class would include it in the TestNG methods... */ public final void notATest() { System.out.println("Base class: NOT a test"); } /** * SubClass of a TestNG class. Some of its methods are TestNG methods, other are not.
* The goal is to check if a group specify in the super-class will include methods of this class.
* And to avoid including too much methods, such as public methods not intended to be TestNG methods. * @author VonC */ public static class Extended extends Base { /** * Test not part a 'aGlobalGroup', but still included in that group due to the super-class annotation.
* Will be executed even if the TestNG class tested is a sub-class. */ @Test public final void anExtendedTest() { System.out.println("Extended class: An Extended test"); } /** * Should not be executed.
* Yet the global annotation Test on the class would include it in the TestNG methods... */ public final void notAnExtendedTest() { System.out.println("Extended class: NOT an Extended test"); } }
0
adăugat

Răspunsul se face printr-un org.testng.IMethodSelector personalizat:

Metoda sa includeMethod() poate exclude orice metodă pe care o dorim, ca o metodă publică care nu este adnotată.

Cu toate acestea, pentru a înregistra un Java MethodSelector personalizat, trebuie să-l adăugați în XMLTest instanța gestionată de orice TestRunner, ceea ce înseamnă că aveți nevoie de propriul TestRunner personalizat .

Dar, pentru a construi un TestRunner personalizat, trebuie să înregistrați un TestRunnerFactory , prin opțiunea -testrunfactory .

DAR NU TREBUIE luată în considerare de către TESTNG clasa ... TESTNG astfel că trebuie să definiți și o clasă TestNG personalizată:

  • pentru a suprascrie metoda de configurare (Map),
  • astfel încât să puteți seta TestRunnerFactory
  • TestRunnerFactory, care vă va construi un TestRunner personalizat,
  • TestRunner care va seta instanței XMLTest un XMLMethodSelector personalizat
  • XMLMethodSelector care va construi un IMethodSelector personalizat
  • IMethodSelector care va exclude orice metodă TestNG aleasă de dvs.!

Ok ... e un coșmar. Dar este și o provocare a codului, deci trebuie să fie puțin provocatoare;)

Tot codul este disponibil la Fragmente DZone .

Ca de obicei, pentru o provocare de cod:

  • o clasă java (și câteva clase interioare)
  • copiați-pastrați clasa într-un director "sursă/test" (deoarece pachetul este "test")
  • rulați-l (nu aveți nevoie de argumente)

Actualizare de la Mike Stone:

Am de gând să accept acest lucru, pentru că sună destul de aproape de ceea ce am făcut, dar m-am gândit să adaug ceea ce am făcut și eu.

Practic, am creat o adnotare de grup care se comportă ca proprietatea grupurilor din adnotările Test (și alte).

Apoi, am creat un GroupsAnnotationTransformer, care utilizează IAnnotationTransformer pentru a examina toate testele și clasele de test fiind definite, apoi modifică testul pentru a adăuga grupurile, care funcționează perfect cu excluderea și includerea grupurilor.

Modificați construirea pentru a folosi noul transformator de adnotare și totul funcționează perfect!

Ei bine ... una dintre avertismente este că nu adaugă grupurile la metode non-test ... pentru că în momentul în care am făcut acest lucru, a existat un alt transformator de adnotări care vă permite să transformați NICIUNEA, dar într-un fel nu a fost inclus în TestNG pe care o foloseam dintr-un anumit motiv ... deci este o idee bună să îmi faci mereu înainte/după metodele adnotateRun = adevărat ... ceea ce este suficient pentru mine.

Rezultatul final este că pot să fac:

@Groups({ "myGroup1", "myGroup2"})
public class MyTestCase {
    @Test
    @Groups("aMethodLevelGroup")
    public void myTest() {
    }
}

Și am făcut transformatorul să lucreze cu subclasarea și totul.

0
adăugat
Îmi pare rău că mi-a trecut atât de mult ... M-am oprit cam uitându-mă pentru o vreme :-)
adăugat autor Mike Stone, sursa
Mike !!! Mike Stone sa întors! Mă bucur că îți place "soluția" mea: a fost una din prima mea provocare de cod la SO;)
adăugat autor VonC, sursa
"Modificați construirea"? Modificați testul Build? Deoarece complexitatea soluției mele există exact pentru a evita modificarea Testng ...
adăugat autor VonC, sursa

Puteți specifica adnotarea @Test la nivel de metodă care permite o flexibilitate maximă.

public class DBTestBase {

    @BeforeTest(groups = "db-test")
    public void beforeTest() {
        System.out.println("Running before test");
    }

    public void method1() {
        Assert.fail();//this does not run. It does not belong to 'db-test' group.
    }

    @Test(groups = "db-test")
    public void testMethod1() {
        Assert.assertTrue(true);
    }
}

Acest lucru funcționează pentru dvs. sau am lipsit ceva din întrebarea dvs.

0
adăugat

TestNG va rula toate metodele publice dintr-o clasă cu o adnotare @Test. Poate că ați putea schimba metodele pe care nu doriți ca TestNG să le ruleze pentru a nu fi publice

0
adăugat