How do I write parameterized tests in EK9?

← Testing · Ref: Q205

EK9 parameterized tests accept typed parameters via standard program parameter syntax. Test data comes from external files.

PARAMETERIZED TEST PROGRAM

Declare parameters with the -> syntax:

  @Test
  MyTest()
    -> input as String
    stdout <- Stdout()
    stdout.println("Got: " + input)

TEST DATA FILES

Each test case has:

  commandline_arg_<N>.txt  - input parameters
  expected_case_<N>.txt    - expected output

Where N is the case number (1, 2, 3, ...).

TYPED PARAMETERS

Parameters are strongly typed. The compiler validates types at compile time, not at test runtime.

MULTIPLE PARAMETERS

  @Test
  Calculator()
    ->
      a as Integer
      b as Integer
    stdout <- Stdout()
    stdout.println($a + b)

See Q204 for black-box testing. See Q155 for basic testing. See Q2 for compile and run.

Example

defines module qa.testdeep.parameterized

  defines program

    // === PARAMETERIZED TEST PATTERN ===
    // @Test programs accept parameters just like regular programs.
    // Test data comes from external files:
    //   commandline_arg_1.txt, expected_case_1.txt
    //   commandline_arg_2.txt, expected_case_2.txt

    ParameterizedTestDemo()
      stdout <- Stdout()

      stdout.println("Parameterized test pattern:")
      stdout.println("  1. @Test program with -> parameters")
      stdout.println("  2. commandline_arg_N.txt for inputs")
      stdout.println("  3. expected_case_N.txt for outputs")
      stdout.println("  4. Same test logic, different data")
      stdout.println("Parameters are strongly typed")

Common mistakes

E50010 — Variables must be declared before use. Using stdout before declaring it with '<-' is a forward reference. See ek9 -h E50010 for details.

Incorrect:

stdout.println("Parameterized test pattern:")
      stdout <- Stdout()

Correct:

stdout <- Stdout()

      stdout.println("Parameterized test pattern:")
Other ways to ask this
  • How do I run the same test with different data in EK9?
  • How do data-driven tests work in EK9?
  • How do I pass parameters to EK9 tests?

Coming from another language?

Java: JUnit @ParameterizedTest with @ValueSource/@CsvSource. Python: @pytest.mark.parametrize. Rust: custom macros or rstest crate. Go: table-driven tests with struct slices. Kotlin: JUnit parameterized or Kotest forAll. EK9: standard program parameters with commandline_arg/expected_case file pairs.

Keywords: multiple, test, parameterized, coverage, commandline, generic, case, expected, data-driven, input