Criterion

A library to write ExUnit tests BDD style

Installation

The package can be installed by adding criterion to your list of dependencies in mix.exs:

def deps do
  [
    {:criterion, "~> 0.1", only: [:test, :dev]}
  ]
end

Usage

Example

defmodule CriterionTest do
  use ExUnit.Case
  import Criterion

  feature "Math" do
    setup do
      {:ok, pi: 3.14}
    end

    scenario "Square" do
      # Step with external implementation
      step("Given a number greater than 5",
        via: &random_number/2,
        where: [min: 2] # Options passed as second argument to the function
      )

      # Step with inline implementation
      step "When the number is multiplied by it self", %{number: number} do
        result = number * number
        %{result: result} # will be merged to the test context
      end

      step "Then the result is greater than the number", %{result: result, number: number} do
        assert result > number
      end

      # You can access data from the initial context of the test
      step "And pi is a constant", %{pi: pi} do
        assert pi == 3.14
      end
    end

    # External step implementation
    defstep random_number(_context, args) do
      min = args[:min] || 0
      %{number: min + Enum.random(0..100)}
    end
  end
end

Generating feature files

mix criterion.gen.features

Options

Feature: Math

  Scenario: Square
    Given a number greater than 1
    When the number is multiplied by it self
    Then the result is greater than the number
    And pi is a constant

Generating test files

mix criterion.gen.tests

Options

test/features/math_test.exs

defmodule MathTest do
  use ExUnit.Case
  import Criterion

  feature "Math" do
    scenario "Square" do
      step "Given a number greater than 1" do
      end

      step "When the number is multiplied by it self" do
      end

      step "Then the result is greater than the number" do
      end

      step "And pi is a constant" do
      end
    end
  end
end