2016-08-23 3 views
1

Есть ли способ получить проверку индекса на Spock? У меня есть где блок, как это:Как получить индекс, проверяемый на том, где блок использует spock?

where: 
column1 | column2 
1 | 3 
1 | 4 
2 | 5 
6 | 8 

Я хочу знать, если это возможно, чтобы получить индекс выполняется на моем тесте. Итак, если у меня будет первый тест (1 | 3), мой индекс будет 0. Если у меня будет третий тест (2 | 5), мой индекс будет равен 2.

Есть ли способ получить этот индекс внутри моего теста?

ответ

1

Вам нужно добавить, @Unroll к вашему определению теста, а затем во имени экзамена #column1 для вывода значения

@Unroll 
def "something #column1 and #column2"() { 
    ... 
} 
+0

Это не так ... Мне нужен индекс внутри самого теста ... чтобы сделать что-то вроде «if (indexBeingTested = 0), иначе if (indexBeingTested> 3), сделайте это« – Igor

+0

Вот документы https://spockframework.github.io/spock/docs/1.0/data_driven_testing.html –

+2

Возможно, вам нужно добавить еще один параметр в свой тест, но если вы используете определенный код на основе индекса, который кажется странным. Эта логика должна быть в вашем распоряжении. –

0

Нечто подобное ниже будет достаточно?

import spock.lang.* 

@Unroll 
class MyFirstSpec extends Specification { 

    def "column1 is #column1 and column2 is #column2 where index is #index"() { 
    expect: 
    if(index in [0, 1]) { 
     assert column1 < column2 
    } else { 
     assert column1 == column2 
    } 

    where: 
    [column1, column2, index] << [ 
     [1, 2, 4, 5], [2, 3, 4, 5] 
    ].transpose().withIndex()*.flatten()  
    } 
} 

Выполнить это Sample

Примечание:
withIndex() доступен из Groovy 2.4.0

+0

Похоже, вы писали столько логики, чтобы проверить вещи, которые очень плохи. Мы должны написать минимальный код в нашем тестовом примере, чтобы передать код и наоборот. –

+0

Точно. Вопрос не в том, чтобы понять, хорошо ли/плохо писать столько логики в тесте. Ответ - просто жизнеспособное решение проблемы. Код в тесте заставляет OP задавать вопрос самому себе, как вы это делали :) – dmahapatro

0

тривиальный ответ был бы добавить индекс или случай, или какой-либо категориальной переменной, которая может быть в разделе результатов.

where: 
    idx | column1 | column2 
    0 | 1  | 3 
    1 | 1  | 4 
    2 | 2  | 5 
    3 | 6  | 8 

Но я должен удивляться, если где положение используется для запуска, что, может быть, должно быть несколько тестов под прикрытием одного теста.

Идентификатор не должен указывать тестовый код, какие проверки должны выполняться в блоке expect/then, и не должен приводить в действие какой-либо проверенный код.

Если тест дает разные результаты, если порядок входов был:

where: 
    idx | column1 | column2 
    0 | 6  | 8 
    1 | 2  | 5 
    2 | 1  | 4 
    3 | 1  | 3 

, то я думаю, что тест должен быть распущено, потому что чувствительность порядка, похоже, указывает, что этот тест проверяет что-то другое чем только пары значений столбца1 и столбца2, и использование там, где это не совсем правильно.