rssh ([info]rssh) wrote,

testing with managed-fixture

Одной из распространенных проблем в модульном тестировании является работа с базой данных (или любым внешними сущностями, которые мутабельны не потому что у программиста руки кривые, а потому что так мир устроен)


То есть в таком случае получается, что либо у нас все тесты расчитаны на определенное состояние БД и при этом не меняют ее состояние (к примеру, исполняются в rollback транзакции), либо какая-то последовательность выполнения тестов и изменения состояния БД описывается руками.

Что-то меня эта ситуация стала напрягать, до такой степени, что я реализовал простой DSL и расширение к scalatest, позволяющие писать нечто вроде:
import ua.gradsoft.testing._
import org.scalatest.managedfixture._

class MyFlatSpec extends managedfixture.[DBFixtureStateTypes.type]
{
 val fuxtureStateTypes = DBFixtureStateTypes
 val fuxtureAccess = DBFixtureAccess
 import DBFixtureStateTypes.States._

 behavior of "My datababase"

 start state(INITIAL) finish state(WITH_ONE)
 it should "be able to add user " in { db =>
    .....
 }

 start state(DATASET1) change(nothing) parallel
 it should "retrieve user with name Jon in our test dataset" in { db =>
    inTransaction {
       val x = db.selectUser("Jon").headOption;
       assert(x!=None)
       assert(x.name == "Jon")
    }
 }



(Здесь перед каждым тестом описано на mini-dsl -- какое начальное состояние требуется для теста и как он его меняет (и если не меняет -- может ли исполняться параллельно с другими))

При выполнении, все тесты в наборе разбиваются на группы, внутри одной группы тесты требуют одинаковое состояние БД и выполняются параллельно, а сами группы выстраиваются в последовательность исполнения, такую что бы число загрузок состояния БД было минимальным)

Вроде работает. Обнаружил попутно, что scalatest внутри довольно архаичный и начал смотреть в сторону spec2 (но там прийдется и фикстуры дописывать)

URL: http://rssh.github.com/fixture-state-management/ может кому пригодится

Tags: scala, одинаковое, разное

  • Post a new comment

    Error

  • 3 comments

[info]ivan_gandhi

February 25 2012, 04:18:42 UTC 3 months ago

Не понял, база реальная или мок? У меня руки-ноги не доходят в моей ситуации мок базу сбацать, трахаюсь с постгресом... но примерно так же, да.

Не понял вот этого, in { db => ... кто это передаёт db? Или это у меня проблемы со скалатестом, что я не могу ничего передать?

[info]rssh

February 25 2012, 07:33:03 UTC 3 months ago Edited:  February 25 2012, 07:35:09 UTC

Программист реализует интерфейс fixtureAccess (http://rssh.github.com/fixture-state-management/api/index.html#ua.gradsoft.testing.FixtureAccess) , который создает БД, подгружает состояние и определяет политику блокировки. То есть БД будет как будет в fixtureAccess. [ У нас обычно реальная]

У scalatest есть набор API для вызова тестов с параметрами (http://www.scalatest.org/user_guide/sharing_fixtures), мы в своей реализайи Suitе, кроме всего прочего, оверрайдим метод org.scalates.fixture.Suite.withFixture, который приводит БД к нужному состоянию и вызывает собственно тест с параметрами

[info]ivan_gandhi

February 25 2012, 18:19:23 UTC 3 months ago

А... а я вот со спексами работаю, и право слово уже на знаю, что и делать. Сплошные withThis, withThat...

Впрочем, главная проблема, что всякая верификация происходит в другой нитке, и мне нужно исключения экспортировать... ну типа опять монады не коммутируют.
Create an Account
Forgot your login or password?
Facebook Twitter More login options
English • Español • Deutsch • Русский…