代码之家  ›  专栏  ›  技术社区  ›  mohana krishnan

如何在TestNg&java/Kotlin中为使用数据提供程序的测试方法设置执行期间的调用计数?

  •  0
  • mohana krishnan  · 技术社区  · 2 年前

    我确实参考了这个链接,并了解 IAnnotationTransformer

    我有一个场景,其中我使用数据提供程序参数化了数据。需要使用调用计数对某些数据运行测试N次。

    如何利用转换?

    @DataProvider(name = "loginData", parallel = false)
    fun loginDataProvider(): MutableIterator<String> {
        val loginTestData: ArrayList<String> = ["abc", "def", "xyz"]
        return loginTestData.iterator()
    }
        
    @Test(dataProvider = "loginData")
    fun funloginTest(loginDetails: String){
        print("The value of $loginDetails")
    }
    

    如何对参数“def”运行此测试4次?

    理想情况下,我想得到 invocationCount 在每次从外部源(如json)运行测试用例之前,针对特定数据运行测试N次

    我试着看了很多 invocationCount I注释转换器 却找不到确切的答案。任何解决问题的想法或代码片段都可以在这里提供帮助

    0 回复  |  直到 2 年前
        1
  •  0
  •   samabcde    2 年前

    IAnnotationTransformer 在这种情况下似乎不起作用。 我建议修改DataProvider方法的行为。

    1. 创建一个需要覆盖调用计数的值映射。
      例如。 { "funloginTest" : { "def" : 4 } }
    2. 在…内 loginDataProvider ,我们可以使用测试方法名称(参考 document of DataProvider )以查看哪些数据需要具有不同的调用计数。
    class RepeatedRunTest {
        // TODO read it from json
        private val testToCaseInvocationCount = mapOf("funloginTest" to mapOf("def" to 4))
    
        @DataProvider(name = "loginData", parallel = false)
        fun loginDataProvider(testMethod: Method): MutableIterator<String> {
            println(testMethod.name)
            val loginTestData: Array<String> = arrayOf("abc", "def", "xyz")
            return loginTestData.map { testData ->
                List(
                    // repeat if needed
                    testToCaseInvocationCount
                        .getOrDefault(testMethod.name, emptyMap())
                        .getOrDefault(testData, 1)
                ) { testData }
            }
                .flatten().toMutableList().listIterator()
        }
    
        @Test(dataProvider = "loginData")
        fun funloginTest(loginDetails: String) {
            print("The value of $loginDetails")
        }
    
    }