Filter the test suites to run
The --test-only option is useful for when you only want to run a specific subset of tests.
In this cookbook, we will walk through how to use the --test-only option with the test sub-command in Scala CLI,
specifically when using the munit and utest test frameworks.
Filter the test suites
The --test-only option in Scala CLI supports using glob patterns to filter test suites to run. A glob pattern is a
string which contains asterisk * characters to match a set of test suites.
Here are three examples of glob patterns for how to filter test suites with --test-only:
- start with
test-test* - end with
test-*test - contains
test-*test*
The --test-only option is supported for every test framework running with Scala CLI.
For example, passing tests.only* to the --test-only option runs only the test suites which start with tests.only:
//> using dep org.scalameta::munit::1.0.2
package tests.only
class BarTests extends munit.FunSuite {
test("bar") {
assert(2 + 3 == 5)
}
}
package tests
class HelloTests extends munit.FunSuite {
test("hello") {
assert(2 + 2 == 4)
}
}
scala-cli test . --test-only 'tests.only*'
# tests.only.BarTests:
# + bar 0.045s
Running a single test case by name
Test frameworks may have their own specific API for specifying the test cases to run aside from the test-only input.
Munit
To run a specific test case inside a test suite pass *test-name* as an argument to Scala CLI:
//> using dep org.scalameta::munit::1.0.2
package tests.only
class Tests extends munit.FunSuite {
test("bar") {
assert(2 + 2 == 5)
}
test("foo") {
assert(2 + 3 == 5)
}
test("foo-again") {
assert(2 + 3 == 5)
}
}
scala-cli test . -- '*foo*'
# tests.only.Tests:
# + foo 0.045s
# + foo-again 0.001s
This will only run the test which contains the name foo, any other tests in your test suite will be skipped.
Utest
Unfortunately, the utest test framework doesn't support using glob pattern * to filter the test cases to run. In
order to run a specific test case you will need to specify the exact name of the test you want to run.
//> using dep com.lihaoyi::utest::0.8.4
import utest.*
object MyTests extends TestSuite {
val tests = Tests {
test("foo") {
assert(2 + 2 == 4)
println("Hello from " + "tests")
}
test("bar") {
assert(2 + 2 == 4)
println("Hello from " + "tests")
}
}
}
scala-cli test . -- 'MyTests.foo'
# -------------------------- Running Tests MyTests.foo --------------------------
# Hello from tests
# + MyTests.foo 8ms
# Tests: 1, Passed: 1, Failed: 0
This will run only the test case with the name MyTests.foo.