This solves two of the biggest problems, as you describe. +1 from me as well. We're working on some things to improve composition in tests, and across tests.
-bt On Fri, May 27, 2016 at 11:18 AM, José Valim < [email protected]> wrote: > Hi everyone, > > There are two recurrent complaints about ExUnit when writing tests: > > 1. It does not support grouping > 2. It does not allow developers to name nor compose setup > > The only way in ExUnit to declare some code as part of a setup is by > declaring a setup block and calling the function inside the block, like > this: > > setup context do > > {:ok, login_as(context)} > > end > > > I would like to propose improvements for those two issues. I will first > write a proposal including code samples and then we can discuss naming and > implementation details. > > ## Groups and named setups > > The idea is to introduce the group/2 macro and allow atoms to be given to > setup: > > defmodule StringTest do > > use ExUnit.Case, async: true > > group "String.capitalize/2" do > > setup :set_test_string > > test "capitalizes the first letter", context do > > assert "T" <> _ = context.test_string > > end > > end > > > group "String.bar/2" do > > setup context do > > # Regular setups are not going anywhere and will still work > > # You may return :ok | keyword | map > > end > > test "..." do ... > > end > > def set_test_string(_context) do > > %{test_string: "test_string"} > > end > > end > > > By using groups, we can now better organize the tests and named setups > allow us to easily share setup logic between groups without relying on > nesting. > > Internally, we can consider "setup :some_atom" to be equivalent to: > > setup context, do: context |> some_atom() > > > The group/2 macro will also store the group tag in the test. For example, > you will be able to: > > mix test --only group:"String.capitalize/2" > > > Setups defined in group/2 will only apply to the group. We will also > support @grouptag to set some tags specific to the current group. setup_all > cannot be called inside the group (as setup_all is always per test case). > We won't allow group calls to be nested (we want developers to compose at > the function level and not on nesting/hierarchies). > > ## Naming > > There is one big open question which is: is "group" a good name? I am > personally not a fan. group works fine for grouping at the unit test level > but it does not read nicely when you want to group based on a condition > (for example, group "when name is an atom"). > > Here are some alternatives: context, testing, group, describe, scenario, > having, etc. I recommend everyone to actually try to write some > pseudo-groups in their tests and see what reads nicely. I would love your > feedback on what you think works nicely. Please include examples. :) > > One of my favorite picks is context but we already use context to mean the > data that goes through setup and tests. > > ## Feedback > > Please give us feedback on this proposal. Those features are mostly > straight-forward to implement, the most important aspects are the semantics. > > Thank you! > > *José Valim* > www.plataformatec.com.br > Skype: jv.ptec > Founder and Director of R&D > > -- > You received this message because you are subscribed to the Google Groups > "elixir-lang-core" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To view this discussion on the web visit > https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4JpFn-%3DGkG_Ya-w64Qqt7OoworqUSAUgzqgWtTFU1fyrw%40mail.gmail.com > <https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4JpFn-%3DGkG_Ya-w64Qqt7OoworqUSAUgzqgWtTFU1fyrw%40mail.gmail.com?utm_medium=email&utm_source=footer> > . > For more options, visit https://groups.google.com/d/optout. > -- Bruce Tate President, RapidRed, LLC Phone: 512.772.4312 Fax: 512 857-0415 Author of Seven Languages in Seven Weeks, Deploying Rails Applications, >From Java to Ruby, Rails: Up and Running, Beyond Java, 6 others. -- You received this message because you are subscribed to the Google Groups "elixir-lang-core" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/elixir-lang-core/CAMp4_igabr5aHYDC1z0FVwhnc%3DqhtAwrt14576r1kZ1MtDgT%2BA%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.
