Running Single Tests Without Tags in ScalaTest: A Comprehensive Guide

Dec 04, 2025 · Programming · 8 views · 7.8

Keywords: ScalaTest | sbt | unit testing

Abstract: This article explores methods for running single tests in ScalaTest without requiring tags. It details the interactive mode features introduced in ScalaTest 2.1.3, explaining the use of -z and -t parameters for substring and exact matching. The discussion covers execution from both the command line and sbt console, with practical code examples and workflow recommendations. Additional insights from other answers on test class organization and quick re-runs are included to provide a holistic testing strategy for developers.

Introduction

In Scala development, using ScalaTest for unit testing is a common practice. However, when test classes contain multiple methods without tags, efficiently running a single test becomes challenging. While traditional tagging methods are effective, they are not usable without prior setup. This article presents a solution for running single tests without tags and analyzes its implementation and use cases in depth.

Core Solution: Substring Matching in Interactive Mode

Since ScalaTest 2.1.3, a feature has been introduced to run single tests without tags in interactive mode. This is achieved using the -z parameter, which allows matching based on substrings of test names. For example, to run all tests whose names include the substring "foo", execute the following command in the sbt console:

testOnly *MySuite -- -z foo

This command will execute only the test methods in MySuite that contain "foo" in their names. This approach is particularly useful for ad-hoc test execution without modifying test code to add tags.

Exact Matching vs. Substring Matching

In addition to substring matching, ScalaTest provides the -t parameter for exact matching. Unlike -z, -t requires the test name to exactly match the specified string. For example:

testOnly *MySuite -- -t "exactTestName"

This will run only the test named "exactTestName". The choice between -z and -t depends on test naming conventions and specific needs. -z is more flexible if test names have unique substrings, while -t is safer for ensuring precision.

Command Line and sbt Console Execution

The above commands can be executed directly in sbt interactive mode. If starting from the system command line, pass the entire command as a single argument to sbt, for example:

sbt 'testOnly *MySuite -- -z foo'

Note the use of quotes to ensure proper parsing. In the sbt console, external quotes can be omitted. This difference stems from the distinct parsing environments of the shell and sbt.

Test Class Specification and Wildcard Usage

When executing tests, the target test class must be specified. Wildcards like * can be used to match class names, e.g., *LoginServiceSpec matches all test classes ending with "LoginServiceSpec". Full class paths, such as com.example.specs.YourTestClass, are also supported. This offers flexibility, especially in large projects.

Supplementary Workflow Recommendations

To run an entire test class, use:

test:testOnly *YourTestClass

After execution, if there are failing tests, test:testQuick can be used to re-run only those that failed. This enhances development efficiency by avoiding redundant executions. Additionally, if a test class is too large, consider splitting it into smaller classes or adding appropriate tags, which also helps adhere to the single responsibility principle.

Practical Application Example

Consider a test class UserServiceSpec with methods: testUserCreation, testUserDeletion, and testUserUpdate. To run only testUserCreation, execute:

testOnly *UserServiceSpec -- -z Creation

If starting from the command line, use:

sbt "testOnly *UserServiceSpec -- -z Creation"

This method allows quick isolation and debugging of specific tests without altering test code.

Conclusion

Through ScalaTest's -z and -t parameters, developers can flexibly run single tests without tags. Combined with sbt's interactive mode and command-line support, this feature significantly improves test execution efficiency and convenience. In practice, it is advisable to choose the matching method based on test naming conventions and organize test class structures optimally to streamline workflows.

Copyright Notice: All rights in this article are reserved by the operators of DevGex. Reasonable sharing and citation are welcome; any reproduction, excerpting, or re-publication without prior permission is prohibited.