2015-05-02 2 views
0

для справки: How make tests always run in same order in Scalatest?Scala: приемочные испытания Заказать

Я планирую проверить мое приложение с помощью вызова контроллеров/маршрутов и сравнивая ответы на мой ожидаемых.

Я не хочу издеваться над своим уровнем персистентности, поэтому я тоже могу проверить его. Теперь мой подход должен состоять в том, чтобы выполнять тесты, чтобы отражать действия пользователя. Пример:

Test 1: User registers 
--> Test 2: (depends on a existing user) User creates profile 
--> Test 3: (depends on a user with existing profile) User changes profile 

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

Этот подход подходит и как указать порядок выполнения в Specs2 или ScalaTest?

ответ

3

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

  • Будучи заинтересованным в том порядке, в котором выполняются свит делает выполнение теста труднее понять
  • Если свита A зависит на сюите B, меняя что-то в сюите B может сломать комплект A, а это значит, что сложнее найти причину неудачного теста.

Из-за этих недостатков я бы рекомендовал вам правильно настроить уровень персистентности в начале каждого приемочного испытания; за счет времени выполнения. Обратите внимание, что вы можете tag your tests и выполнять ваши медленные приемочные испытания, чтобы не замедлять цикл разработки.

Если вы хотите реализовать зависимые тесты в ScalaTest, тем не менее, вы можете создать вложенный набор тестов, как предлагается в этом вопросе вы связаны:

Если предположить, что уровень постоянного хранения:

object Users { 
    var users: List[User] = Nil 

    def apply(i: Int): User = users(i) 

    def register(user: User): Unit = users = user :: users 

    def isEmpty: Boolean = users.isEmpty 
} 

class User(var profile: Option[Profile] = None) { 
    def createProfile(): Unit = profile = Some(new Profile) 
} 

class Profile(var content: String = "") { 
    def update(newContent: String): Unit = content = newContent 
} 

и ваше лицо Тесты:

@DoNotDiscover 
class Test1 extends FlatSpec with ShouldMatchers { 
    "register" should "store a new user" in { 
    Users.register(new User) 

    Users should not be 'empty 
    } 
} 

@DoNotDiscover 
class Test2 extends FlatSpec with ShouldMatchers { 
    "createProfile" should "create a new user profile" in { 
    val user = Users(0) 
    user.createProfile() 

    user.profile shouldBe 'defined 
    } 
} 

@DoNotDiscover 
class Test3 extends FlatSpec with ShouldMatchers { 
    "update" should "update the content of the profile" in { 
    val newContent = "Test" 
    val profile = Users(0).profile.get 
    profile.update(newContent) 

    profile.content shouldBe newContent 
    } 
} 

вы можете вложить их в приемочного испытания набора:

class AcceptanceTests extends Suites(
    new Test1, 
    new Test2, 
    new Test3 
) with SequentialNestedSuiteExecution 

Аннотации @DoNotDiscover необходимо, чтобы тестовый бегун не выполнял вложенные тесты отдельно (поскольку они сами являются наборами тестов). Смешивание в признаке SequentialNestedSuiteExecution гарантирует, что вложенные тесты выполняются в заданном порядке.

+0

Хотя я не использовал его сам, возможно, [FitNesse] (http://www.fitnesse.org/), который представляет собой специализированную платформу для интеграции/принятия тестов, больше подходит для ваших потребностей, чем ScalaTest. –

+0

Спасибо за ваш ответ. Я понимаю ваши рассуждения. Мне кажется, что это неправильно, делать сами приборы настойчивости, когда я могу повторно использовать существующие тесты в смысле просмотра их в качестве моих функций настройки ... Я ценю код примера! –

Смежные вопросы