ejpcmac
Property-testing Phoenix applications
Hello everybody!
I’ve discovered property-testing with stream_data a few months ago. Since then, I’ve successfully re-written the tests of a library, and I’m willing to use property-testing everywhere I can.
I’ve tried to property-test a Phoenix context boundary, but I’m facing performance issues:
defmodule Kakte.AccountsTest
use Kakte.DataCase
alias Kakte.Accounts
alias Kakte.Repo
[...]
property "list_users/0 returns all users" do
# user_attrs/0 is a generator for valid user attributes.
check all attrs_list <- uniq_list_of(user_attrs(), length: 5) do
Repo.transaction(fn ->
users =
Enum.map(attrs_list, fn attrs ->
{:ok, user} = Accounts.register(attrs)
user
end)
users_list = Accounts.list_users()
assert length(users) == 5
Enum.each(users, fn user -> assert user in users_list end)
Repo.rollback(:done)
end)
end
end
[...]
end
Running this test takes more than 2.5 seconds on my machine. I know a property-test is expected to be longer to execute due to higher number of tests, but 2.5 seconds for one test is way too long IMO. I’ve tried to replace the test body by assert true and it runs quick, so I presume this is due to many repo transactions, but maybe I am misleading.
I have basically three questions:
- Is it a good idea to use property-testing everywhere?
- Do you property-test your Phoenix applications?
- How can I manage to speed up this test?
For information, the context source is here on GitHub.
Most Liked
idi527
It depends on what you are testing in this case, and whether if can be accomplished with unit tests. Maybe you can separate the test above into property tests on changeset functions and then a unit test on “list_users/0 returns all users”. However, if you do need to touch the database in your property tests (for example, if you use stateful property tests for state machines backed by postgres), then maybe try reducing the complexity of the tests (with :numtests, :max_size proper or propcheck options and sized macro) so that they don’t run for too long during development.
but 2.5 seconds for one test is way too long IMO
It might be okay if you leave them to run overnight on some remote testing server, then you’d have a higher confidence that the code works as expected.
UPDATE: There are similar options for stream data as well.
LostKobrakai
Most of that time is probably due to you hitting the database. You’ll get much better times for testing pure computation.
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #javascript
- #code-sync
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #advent-of-code
- #elixirconf-us
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #performance








