HA3 CBTG: Generált és egyéni tesztesetek összeakadása maven test futtatásakor

0 votes
asked Nov 11, 2018 in SWSV by Willshield (25 points)  

Sziasztok!

A HA3 CBTG részéhez evosuite eszközt szeretnénk használni, mely többé kevésbé sikerült is, készültek generált tesztjeink. Azonban ha egyszerre futtatjuk a korábbi tesztekkel az újonnan generáltakat (pl. mvn test) akkor a régi tesztek nem futnak le, a következő hibát adják:

org.mockito.exceptions.base.MockitoException: 
ClassCastException occurred while creating the mockito mock :
  class to mock : 'hu.bme.mit.swsv.ris.common.logging.LoggerWrapper', loaded by classloader : 'sun.misc.Launcher$AppClassLoader@4f3f5b24'
  created class : 'hu.bme.mit.swsv.ris.common.logging.LoggerWrapper$MockitoMock$1169644998', loaded by classloader : 'net.bytebuddy.dynamic.loading.MultipleParentClassLoader@302c971f'
  proxy instance class : 'hu.bme.mit.swsv.ris.common.logging.LoggerWrapper$MockitoMock$1169644998', loaded by classloader : 'net.bytebuddy.dynamic.loading.MultipleParentClassLoader@302c971f'
  instance creation by : ObjenesisInstantiator

You might experience classloading issues, please ask the mockito mailing-list.

    at hu.bme.mit.swsv.ris.tsm.test.SafetyLogicLocalTest.setUp(SafetyLogicLocalTest.java:47)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: java.lang.ClassCastException: hu.bme.mit.swsv.ris.common.logging.LoggerWrapper$MockitoMock$1169644998 cannot be cast to org.mockito.internal.creation.bytebuddy.MockAccess
    at org.mockito.internal.creation.bytebuddy.SubclassByteBuddyMockMaker.createMock(SubclassByteBuddyMockMaker.java:48)
    at org.mockito.internal.creation.bytebuddy.ByteBuddyMockMaker.createMock(ByteBuddyMockMaker.java:25)
    at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:35)
    at org.mockito.internal.MockitoCore.mock(MockitoCore.java:69)
    at org.mockito.Mockito.mock(Mockito.java:1895)
    at org.mockito.Mockito.mock(Mockito.java:1804)
    ... 24 more

Ha külön-külön kézzel futtatjuk őket, minden rendben. Ezt a tutorialt követtük, melyben elvileg külön kitértek rá, hogy a surefire plugin-nal lehet manuális és generált teszteket együtt futtatni. Próbálkoztunk a test scaffolding különböző paraméterezésével is, de sajnos nem javította meg a problémát.

Találkozott esetleg valaki hasonló hibával? Van valami ötlet mivel érdemes még próbálkozni?

Köszi!
loremipsum csapat

commented Nov 12, 2018 by micskeiz (2,873 points)  
Ezt próbáltátok?

Keeping EvoSuite tests separate from developer-written tests
http://www.evosuite.org/documentation/tutorial-part-2/

Lehet külön is tartani az evosuite teszteket.
commented Nov 13, 2018 by Willshield (25 points)  
Igen, sajnos ha külön mappába generáltuk a teszteseteket és ha mvn test futtatta őket akkor is összeakadt a fenti hibákkal. Ha olyan helyre tesszük, ahol nem találja meg, értelem szerűen nem kerülnek futtatásra és "minden rendben", kézzel pedig tudjuk futtatni a generáltakat ha kell. Próbáltuk úgy is, hogy először kitöröltük a létező teszteket és utólag raktuk mellé, sajnos ugyanazt produkálta.

Hosszas utánajárással azt tartjuk találtuk, hogy a scaffolding rész lehet a hibás, melyhez az eszköz dokumentációjában azt írták, hogy jó esetben soha nem kell hozzányúlni, nem is találtunk leírást mit lehet érdemes ezen állítani. Ez a rész betölt mock osztályokat, amik összeakadnak a manuálisan készített tesztek mock osztályaival, mert valahogy nem takarít ki maga után teljesen. Ennek ellenére a Mockito konfigurációjában a class cachinget kikapcsolva, valamint a korábban emlegetett erre való surefire plugint használva sem változott a helyzet.

Jelenleg úgy oldottuk meg, hogy nem exportáltuk ki a teszteket, hanem a .evosuite mappa tartalmát felpusholtuk a branchre, és onnan tervezzük hivatkozni a generált teszteket a kiértékeléséhez. Az mvn test így nem találja meg a generáltakat és nem futtatja, csak ha manuálisan elindítjuk, szóval a build legalább nem törik el az összeakadó tesztek miatt. Sajnos ez így nem túl életszerű, de ha továbbra sem találunk megoldást, elfogadható lehet így is ez a feladatrész?

2 Answers

+1 vote
answered Nov 18, 2018 by valkorn (87 points)  

Nálunk megoldotta a problémát az, ha az evosuite által generált teszteket futtattuk utoljára (export default helyre + surefire plugin)

Csak akkor jött elő ez a hiba, amikor az evo tesztek után futott még kézzel írt teszt.

Teszt sorrend megadása:
https://stackoverflow.com/questions/12075725/how-do-i-control-the-order-of-execution-of-tests-in-maven

commented Nov 19, 2018 by Willshield (25 points)  
Sajnos ezt már későn láttuk, határidő után, de ez valóban jónak tűnik. Köszi!
0 votes
answered Nov 13, 2018 by micskeiz (2,873 points)  

A commentben írt megoldás jó workaroud (evosuite tesztek nem exportálása). Látszik, hogy próbáltatok utánajárni a problémának, de nem triviális a megoldása. Dokumentáljátok kérlek a csapat wikin a tapasztalatokat, és írjátok le, hogy hogyan lehet majd kézzel futtatni a generált teszteket.

...