blob: 22ffab9a9242a4494cf46cd4035b5de046348c6f [file] [log] [blame] [view] [edit]
# Unit tests
Unit tests are for Starlark code that isn't specific to analysis-phase or
loading phase cases; usually utility code of some sort. Such tests typically
don't require a rule `ctx` or instantiating other targets to verify the code
under test.
To write such a test, simply write a function accepting `env` and pass it to
`test_suite`. The test suite will pass your verification function to
`unit_test()` for you.
```starlark
# BUILD
load(":my_tests.bzl", "my_test_suite")
load("@rules_testing//lib:test_suite.bzl", "test_suite")
my_test_suite(name = "my_tests")
# my_tests.bzl
def _foo_test(env):
env.expect.that_str(...).equals(...)
def my_test_suite(name):
test_suite(
name = name,
basic_tests = [
_foo_test,
]
)
```
Note that it isn't _required_ to write a custom test suite function, but doing
so is preferred because it's uncommon for BUILD files to pass around function
objects, and tools won't be confused by it.
## Customizing setup
If you want to customize the setup (loading phase) of a unit test, e.g. to add
custom attributes, then you need to write in the same style as an analysis test:
one function is a verification function, and another function performs setup and
calls `unit_test()`, passing in the verification function.
Custom tests are like basic tests, except you can hook into the loading phase
before the actual unit test is defined. Because you control the invocation of
`unit_test`, you can e.g. define custom attributes specific to the test.
```starlark
# my_tests.bzl
def _foo_test(name):
unit_test(
name = name,
impl = _foo_test_impl,
attrs = {"myattr": attr.string(default="default")}
)
def _foo_test_impl(env):
env.expect.that_str(...).equals(...)
def my_test_suite(name):
test_suite(
name = name,
custom_tests = [
_foo_test,
]
)
```
Note that a custom test is not required to define custom attributes; the above
is just an example. If you want to define custom attributes for every test in a
suite, the `test_kwargs` argument of `test_suite` can be used to pass additional
arguments to all tests in the suite.