arcanemachine
I’m writing some tests and I want to build a “common language” for writing test tags. I’m using this post to document my findings as I learn about the built-in test tags, while also seeing what custom tags the Elixir community uses in their tests.
Built-In Tags
ExUnit has quite a few built-in tags:
@tag :skipor@tag skip: "some reason to skip"- Tests that should be skipped (unless run with--only skip). Support for this tag is built-in to ExUnit.
Custom Tags
Here are some of the custom tags I use or have encountered:
-
@tag :slow- Tests that take a long time to run. -
@tag :external- Tests that call an external service or API -
@tag :mock- Indicates that a test uses a mock to pass. (This tag can be paired with another test that uses@tag :externalso there is an option to run a “live” version of the mocked test.) -
@tag :fixme- A temporary placeholder tag that I use when I’m working on one specific test and only want it to run.
What test tags do you commonly use? Post them here so we can all speak the same language!
Other @tag tips, tricks, and hacks are welcome here too. ![]()
Trending in Discussions
Other Trending Topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #library
- #deployment
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #elixirconf
- #channels
- #exunit
- #discussion
- #code-sync
- #podcasts
- #javascript
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #ai
- #elixirconf-us
- #blog-post
- #elixir-ls
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #elixirconf-eu
- #metaprogramming
- #hex










Showing Posts 18 to 9- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
kenny-evitt
I wouldn’t write a test that depends on another one running (and passing) first/before. I’d just repeat the ‘earlier’ test(s) (or the relevant code) in the ‘dependent’ test.
(Really, I’d extract the common ‘setup’ code into a function that both tests can then call – mainly so I know that both tests should be ‘relying’ on the exact same ‘code behavior’.)
kenny-evitt
That’s exactly why I started using an
:externaltag in my own tests.‘End-to-end’ tests are nice, but they’re also flakey, so it’s nice to be able to run them separately and NOT have CI/CD pipelines fail because the test service is down.
sbuttgereit
Just off the cuff, sounds like a fine use of tags.
What you describe is a real testing scenario and it’s the kind of thing you often want on demand, not all the time.
One thing I do is specifically exclude tags so that I have to specifically request the run. I do that in
test_helper.exswith something along the lines of:That excludes my integration tests so that if I don’t specify a test category that I get the unit tests only. Something similar would be useful to exclude external tests, too: you have to explicitly ask for testing external resources.
sbuttgereit
Not sure that supports my “Integration Test” use case. The non-random, sequential test execution is a feature, not a bug, for this case; this is why not only is the random seed fixed, it’s fixed to “0”: this means the tests run in the specific order in which they are defined in the test script.
My “Integration Tests” prove the supported business processes, not the functions. Let’s say I have two functions
create_userandauthenticate_user. I do want to test that I can create the user, but, more importantly in this context, that the user created bycreate_usercan be understood and works when processing functionauthenticate_user: the data must flow from one function to the next for the integration test to serve its purpose. It would be nice for the data values processed by these functions to originate randomly at the start of the integration test, but I want to see the results of earlier, data producing functions working well with later, data consuming functions.My “Unit Tests” prove the functions, not the business processes. These tests are run asynchronously using a completely random seed and are focused on individual function workings. In this case, my example
authenticate_userfunction can be tested in isolation at any time since I can establish pre-conditions (including pre-requisite data) for that specific test. It’s nice for any data seeding here to be random, too.So in all cases, I’d like to have property-based-testing-like source data, but the testing goals have different needs when it comes to ordering execution.
arcanemachine
I’m still a noob when it comes to anything beyond basic testing. I haven’t figured out how best to handle tests to “external” APIs. I can mock them which is fine, but I like to have real tests that check against the real, actual service. That’s how I have envisioned the idea behind the
externaltag. (I’ve seen it used elsewhere too.)kenny-evitt
I have a nice little test helper to seed the standard random functions from the Mix test seed so that random tests can be (exactly) reproduced, without needing to use a single fixed random seed.
kenny-evitt
You might like
ExUnit.Parameterized; very readable.kenny-evitt
I just added some tests with
external: truetags; not quite sure what to do with CI/CD; probably ‘warn but don’t fail’ for those tests.sodapopcan
Ah thanks, so there is! I have a whole bunch of functions like this and initially I was toying around with unhygenic macro-versions to avoid passing
lvall the time. I backed-out of that idea and converted them all to functions which is likely how I ended up with this straggler. I’ll probably keep it to keep inline with my little single-word function thing I got going on!RudManusachi
Hey, there is
has_element?(view, selector, text_filter \\ nil)