Rendezvous-Tokyo

Scalaのtestでpytestのparametrize風実装

Scalaのtestでpytestのparametrize風実装メモ

pytestのparametrize

parametrizeを使用してパラメータ化されたテストを行うサンプルコード

# テスト対象のコード(例:calculator.py)
def add(x, y):
    return x + y

# テストコード(例:test_calculator.py)
import pytest
from calculator import add

# @pytest.mark.parametrizeを使用してパラメータ化されたテストを行う
@pytest.mark.parametrize("input_a, input_b, expected", [
    (1, 2, 3),      # テストケース1
    (5, 5, 10),     # テストケース2
    (0, 0, 0),      # テストケース3
    (-1, 1, 0),     # テストケース4
    (-5, -5, -10),  # テストケース5
])
def test_addition(input_a, input_b, expected):
    result = add(input_a, input_b)
    assert result == expected

scalaで同じこと

import org.scalatest.funspec.AnyFunSpec

// テスト対象のコード(例:Calculator.scala)
class Calculator {
  def add(x: Int, y: Int): Int = x + y
}

// テストコード(例:CalculatorTest.scala)
import org.scalatest.funsuite.AnyFunSuite
import org.scalatest.prop.TableDrivenPropertyChecks

class CalculatorTest extends AnyFunSuite with TableDrivenPropertyChecks {

  val calculator = new Calculator

  val testCases = Table(
    ("inputA", "inputB", "expected"),
    (1, 2, 3),      // テストケース1
    (5, 5, 10),     // テストケース2
    (0, 0, 0),      // テストケース3
    (-1, 1, 0),     // テストケース4
    (-5, -5, -10)   // テストケース5
  )

  test("should add two numbers") {
    forAll(testCases) { (inputA, inputB, expected) =>
      val result = calculator.add(inputA, inputB)
      assert(result == expected)
    }
  }
}

感想

なんでScala使うんだっけ...?

以上。