lundi 9 avril 2018

Spek parameterized tests

I'm trying to write a single test from about 8 hours... The problem is really strange behavior (for me) in Spek. Sometimes it executes, sometimes not. I had an error "Test class cannot have two constructors" without any reason. When i deleted class DriverTest(val filePath: String, val expectedTextResult: String) and then put it again, it worked... Anyway, what I'm trying to do is parameterized test:

@RunWith(JUnitPlatform::class)
class ChromeDriverConfigurationTest : Spek
({
    class DriverTest(val filePath: String, val expectedTextResult: String)

    given("Chrome Driver") {
        val chromeDriver: ChromeDriver by lazy { setupChromeDriverForTest() }
        afterGroup { deleteChromeDriver(chromeDriver) }

        listOf(
            DriverTest(filePath = "js/js.html", expectedTextResult = "Text from JS!"),
            DriverTest(filePath = "jQuery/jQuery.html", expectedTextResult = "I come from jQuery!"),
            DriverTest(filePath = "angularv1/angularv1.html", expectedTextResult = "Hello from Angular v1!"),
            DriverTest(filePath = "reactJS/index.html", expectedTextResult = "Hello from reactJS!")
        ).forEach { driverTest ->
            println("BBBBBBBBBBBBBBBBBBBBBB")
            val path = ChromeDriverConfigurationTest::class.java.getResource(driverTest.filePath).path
            chromeDriver.get("file://$path")
            it("should extract test") {
                println("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")
                val text = chromeDriver.findElement(By.id("test")).text
                assert(text == driverTest.expectedTextResult)
            }

        }
    }
})

In this case, I dont see any "AAAAAAAAAAAAAA..", but I see "BBBBBBBB" 4 times. It loks like, it section doesn't run. Alright, maybe there is something wrong with chromeDriver.get, lets comment it (rest stays same)

//val path = ChromeDriverConfigurationTest::class.java.getResource(driverTest.filePath).path
//chromeDriver.get("file://$path")

Now I get...

BBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBB
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

he? whats going on. Alright, lets move context group inside for each like I saw in many tutorials:

@RunWith(JUnitPlatform::class)
class ChromeDriverConfigurationTest : Spek
({
    class DriverTest(val filePath: String, val expectedTextResult: String)

    listOf(
        DriverTest(filePath = "js/js.html", expectedTextResult = "Text from JS!"),
        DriverTest(filePath = "jQuery/jQuery.html", expectedTextResult = "I come from jQuery!"),
        DriverTest(filePath = "angularv1/angularv1.html", expectedTextResult = "Hello from Angular v1!"),
        DriverTest(filePath = "reactJS/index.html", expectedTextResult = "Hello from reactJS!")
    ).forEach { driverTest ->
        given("Chrome Driver") {
            val chromeDriver: ChromeDriver by lazy { setupChromeDriverForTest() }
            afterGroup { deleteChromeDriver(chromeDriver) }
            println("BBBBBBBBBBBBBBBBBBBBBB")
            val path = ChromeDriverConfigurationTest::class.java.getResource(driverTest.filePath).path
            chromeDriver.get("file://$path")
            it("should extract test") {
                println("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")
                val text = chromeDriver.findElement(By.id("test")).text
                assert(text == driverTest.expectedTextResult)
            }

        }
    }
})

Surprise again:

BBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBB

Okay, just leave these "readability", and make it work... Lets put everything to it section.

@RunWith(JUnitPlatform::class)
class ChromeDriverConfigurationTest : Spek
({
class DriverTest(val filePath: String, val expectedTextResult: String)

listOf(
    DriverTest(filePath = "js/js.html", expectedTextResult = "Text from JS!"),
    DriverTest(filePath = "jQuery/jQuery.html", expectedTextResult = "I come from jQuery!"),
    DriverTest(filePath = "angularv1/angularv1.html", expectedTextResult = "Hello from Angular v1!"),
    DriverTest(filePath = "reactJS/index.html", expectedTextResult = "Hello from reactJS!")
).forEach { driverTest ->
    given("Chrome Driver") {
        it("should extract test") {
            val chromeDriver: ChromeDriver by lazy { setupChromeDriverForTest() }
            afterGroup { deleteChromeDriver(chromeDriver) }
            println("BBBBBBBBBBBBBBBBBBBBBB")
            val path = ChromeDriverConfigurationTest::class.java.getResource(driverTest.filePath).path
            chromeDriver.get("file://$path")
            println("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")
            val text = chromeDriver.findElement(By.id("test")).text
            assert(text == driverTest.expectedTextResult)
        }

    }
}
}) 

Ohh great it works! But wait a second..., it executes only 1 test, I mean only for first element in list. Hę? Could someone explain me please this behavior? Also maybe you know some other alternatives to Spek? I would write my tests in Kotlin. But with Spek it looks almost impossible

Aucun commentaire:

Enregistrer un commentaire