How do I run tests and see results in EK9?

← Testing · Ref: Q157

EK9 provides a built-in test runner with multiple output formats and coverage reporting. Use the -t flag to run tests from the command line.

THE -t FLAG
Run all tests in a file:

  ek9 -t file.ek9

This runs every @Test program and reports results in human-readable format.

OUTPUT FORMATS

EK9 supports multiple output formats:

  ek9 -t file.ek9    # Human-readable (default)
  ek9 -t0 file.ek9   # Terse (pass/fail only)
  ek9 -t2 file.ek9   # JSON (for AI/tool parsing)
  ek9 -t3 file.ek9   # JUnit XML (for CI integration)

RUNNING TEST GROUPS

Run a specific test group:

  ek9 -tg database file.ek9

This runs only tests marked with @Test: "database".

LISTING TESTS

List all tests without running them:

  ek9 -tL file.ek9

COVERAGE

Run tests with coverage reporting:

  ek9 -tC file.ek9   # Coverage summary after tests
  ek9 -t4 file.ek9   # Detail JSON coverage
  ek9 -t5 file.ek9   # Verbose coverage
  ek9 -t6 file.ek9   # HTML coverage report

Coverage must be at least 80% for packaging with -P.

EXIT CODES

The test runner uses specific exit codes:

  - 0: all tests pass, coverage OK
  - 11: one or more tests failed
  - 12: tests pass but coverage below 80%

See Q155 for writing tests. See Q156 for assertions. See Q2 for compile and run. See Q204 for black-box testing. See Q206 for test coverage. See Q322 for profiling data. See Q628 for profiling tests. See Q749 for fuzzing overview. See Q754 for automatic test generation.

Example

#!ek9
defines module qa.testing.running

  defines function

    multiply() as pure
      ->
        first as Integer
        second as Integer
      <- rtn as Integer: first * second

  defines program

    // === BASIC TEST ===

    @Test
    MultiplyTest()
      stdout <- Stdout()
      result <- multiply(6, 7)
      assert result == 42
      stdout.println("6 * 7 = " + $result)

    // === GROUPED TEST ===

    // Run this group only with: ek9 -tg math file.ek9
    @Test: "math"
    AdditionTest()
      stdout <- Stdout()
      assert 2 + 2 == 4
      stdout.println("Addition test passed")

    @Test: "math"
    SubtractionTest()
      stdout <- Stdout()
      assert 10 - 3 == 7
      stdout.println("Subtraction test passed")

    // === DEMONSTRATING TEST STRUCTURE ===
    // Run all tests:       ek9 -t file.ek9
    // Run math group only: ek9 -tg math file.ek9
    // JSON output:         ek9 -t2 file.ek9
    // JUnit XML output:    ek9 -t3 file.ek9
    // With coverage:       ek9 -tC file.ek9

Common mistakes

E50060 — Integer has no intValue() method. multiply() already returns an Integer. See ek9 -h E50060 for details.

Incorrect:

result <- multiply(6, 7).intValue()

Correct:

result <- multiply(6, 7)

E50060 — Integer has no toString() method. Use the $ prefix operator for string conversion or string concatenation. See ek9 -h E50060 for details.

Incorrect:

stdout.println(result.toString())

Correct:

stdout.println("6 * 7 = " + $result)
Other ways to ask this
  • How do I run EK9 tests from the command line?
  • How do I check test coverage in EK9?
  • What test output formats does EK9 support?

Coming from another language?

Java: mvn test or gradle test with JUnit, JaCoCo for coverage. Python: pytest with pytest-cov for coverage. Rust: cargo test with tarpaulin for coverage. Go: go test -v with go test -cover. EK9: built-in ek9 -t runner with JSON/JUnit XML output formats and integrated coverage via -tC flags, no external tools needed.

Keywords: assert, compile, coverage, format, group, json, junit, output, result, results, run, runner, test, verify