0Pricing
Scala for Backend Engineering & Functional Programming · Урок

Моки и фикстуры

Настройка тестов

«Моки и фикстуры» — бесплатный урок Scala for Backend Engineering & Functional Programming на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Scala for Backend Engineering & Functional Programming, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Scala for Backend Engineering & Functional Programming содержит 4 уроков всего.

Подготовка и очистка после тестов

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

Простое приспособление: только метод

Самое простое приспособление — вспомогательный метод, создающий свежее состояние. Каждый тест вызывает его, что гарантирует изоляцию.

import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers

class StackSpec extends AnyFlatSpec with Matchers {
  def emptyStack(): scala.collection.mutable.Stack[Int] =
    scala.collection.mutable.Stack.empty[Int]

  "a stack" should "start empty" in {
    emptyStack().size shouldBe 0
  }
}

BeforeAndAfter

Подключите BeforeAndAfter, чтобы выполнять код до и после каждого теста с помощью блоков before { } и after { }.

import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers
import org.scalatest.BeforeAndAfter

class DbSpec extends AnyFlatSpec with Matchers with BeforeAndAfter {
  var counter = 0
  before { counter = 10 }
  after  { counter = 0 }

  "counter" should "be initialized" in {
    counter shouldBe 10
  }
}

BeforeAndAfterAll

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

import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.BeforeAndAfterAll

class ServerSpec extends AnyFlatSpec with BeforeAndAfterAll {
  override def beforeAll(): Unit = println("start server")
  override def afterAll(): Unit  = println("stop server")

  "server" should "respond" in {
    assert(true)
  }
}

Шаблон передачи ресурса

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

import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers

class FileSpec extends AnyFlatSpec with Matchers {
  def withBuffer(test: StringBuilder => Any): Unit = {
    val buf = new StringBuilder("init")
    try test(buf)
    finally buf.clear()
  }

  "a buffer" should "start with init" in withBuffer { buf =>
    buf.toString shouldBe "init"
  }
}

Зачем нужны имитации?

Имитация — это заменитель реальной зависимости (например, базы данных или HTTP-клиента), благодаря которому модульный тест остаётся быстрым и детерминированным. Вы управляете возвращаемым имитацией значением и проверяете, как она была вызвана.

Добавление Mockito

ScalaTest интегрируется с Mockito через scalatestplus. Добавьте зависимость и подключите MockitoSugar.

libraryDependencies += "org.scalatestplus" %% "mockito-5-10" % "3.2.18.0" % Test

Задание поведения метода

Создайте имитацию и задайте её поведение с помощью when(...).thenReturn(...). Затем тест выполняет код, который от неё зависит.

import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers
import org.scalatestplus.mockito.MockitoSugar
import org.mockito.Mockito.when

trait Repo { def find(id: Int): String }

class RepoSpec extends AnyFlatSpec with Matchers with MockitoSugar {
  "a repo" should "return stubbed value" in {
    val repo = mock[Repo]
    when(repo.find(1)).thenReturn("Alice")
    repo.find(1) shouldBe "Alice"
  }
}

Проверка взаимодействий

Помимо возвращаемых значений, можно проверить, что метод был вызван ожидаемое число раз, с помощью verify.

import org.scalatest.flatspec.AnyFlatSpec
import org.scalatestplus.mockito.MockitoSugar
import org.mockito.Mockito.{verify, times}

trait Logger { def log(msg: String): Unit }

class LogSpec extends AnyFlatSpec with MockitoSugar {
  "a service" should "log once" in {
    val logger = mock[Logger]
    logger.log("hi")
    verify(logger, times(1)).log("hi")
  }
}

Имитации, заглушки и поддельные реализации

Терминология:

  • Заглушка: возвращает заранее подготовленные ответы.
  • Имитация: также позволяет проверять взаимодействия.
  • Поддельная реализация: лёгкая рабочая реализация (например, репозиторий в памяти).

Если задача простая, предпочитайте поддельные реализации или настоящие объекты; используйте имитации только для действительно внешних зависимостей.

Сохранение изоляции тестов

Тестовые приспособления и имитации преследуют одну цель: каждый тест должен выполняться в известном независимом состоянии. Сбрасывайте общее изменяемое состояние перед каждым тестом и не используйте общие изменяемые приспособления, чтобы предотвратить нестабильные сбои, зависящие от порядка выполнения.

Быстрая проверка

Проверьте свои знания о тестовых приспособлениях и имитациях.

Итоги

Вы изучили тестовые приспособления и имитации:

  • Приспособления: вспомогательные методы, BeforeAndAfter, BeforeAndAfterAll и шаблон передачи ресурса.
  • Имитации (через MockitoSugar): задавайте заглушки с помощью when().thenReturn(), проверяйте вызовы с помощью verify.
  • Для простых случаев предпочитайте поддельные реализации; имитируйте внешние зависимости.
  • Сохраняйте изоляцию каждого теста и независимость от порядка выполнения.

Часто задаваемые вопросы

Урок «Моки и фикстуры» бесплатный?

Да — полный текст урока «Моки и фикстуры» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Scala for Backend Engineering & Functional Programming, подпишись на CoddyKit PRO. Курс Scala for Backend Engineering & Functional Programming содержит 4 уроков всего.

Чему я научусь в уроке «Моки и фикстуры»?

Настройка тестов Ты практикуешь Scala for Backend Engineering & Functional Programming с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Scala for Backend Engineering & Functional Programming?

Предыдущий опыт не требуется. Scala for Backend Engineering & Functional Programming на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Моки и фикстуры»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Scala for Backend Engineering & Functional Programming?

Да. Каждый урок Scala for Backend Engineering & Functional Programming включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Стили ScalaTest
  2. Сопоставители
  3. Тестирование на основе свойств
  4. Моки и фикстуры
← Назад к Scala for Backend Engineering & Functional Programming