Skip to content
Smaller test framework, because it has power asserts as the only assertion.
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
assets
bin
exp
spec
src
.dockerignore
.gitignore
.guardian.yml
.travis.yml
CHANGELOG.md
Dockerfile
LICENSE
README.md
README.md.template
shard.yml

README.md

microtest Build StatusDependency Status

Version 1.2.1

A very tiny testing framework inspired by minitest/minitest.cr.

Features

  • This framework is opinionated
  • It uses power asserts by default. There are no assert_equals, assert_xyz, just power asserts (except for assert_raises)
  • It uses the spec syntax for test case structure (describe, test, before, after). Reasons: No test-case name-clashes when using describe. Not forgetting to call super in setup/teardown methods.
  • No nesting of describe blocks. IMO nesting of those blocks is an anti-pattern.
  • No let-definitions. Only before / after hooks. Use local variables mostly.
  • Tests have to be started explicitly by Microtest.run!, no at-exit hook.

Installation

Add this to your application's shard.yml:

development_dependencies:
  microtest:
    github: ragmaanir/microtest
    version: ~> 1.2.1

And add this to your spec_helper.rb:

require "../src/microtest"

include Microtest::DSL

Microtest.run!

Usage

describe MyLib::WaterPump do
  test "that it pumps water" do
    p = MyLib::WaterPump.new("main")
    p.enable
    p.start

    assert(p.pumps_water?)
  end

  test "that it pumps with a certain speed" do
    p = MyLib::WaterPump.new("main", speed: 100)
    p.enable
    p.start

    assert(p.pump_speed > 50)
  end

  test "this one is pending since it got no body"

  test "only run this focused test", :focus do
  end

  test! "and this one too since it is focused also" do
  end
end

Run the test with:

crystal spec

You can provide the seed to run the tests in the same order:

SEED=123 crystal spec

Power Assert Output

describe AssertionFailure do
  test "assertion failure" do
    a = 5
    b = "aaaaaa"
    assert "a" * a == b
  end
end

Generates:

Assertion Failure

Microtest Test Output (default reporter)

Default

Reporters

Select the used reporters:

Microtest.run!([
  Microtest::DescriptionReporter.new,
  Microtest::ErrorListReporter.new,
  Microtest::SlowTestsReporter.new,
  Microtest::SummaryReporter.new,
] of Microtest::Reporter)
describe First do
  test "success" do
  end

  test "skip this"
end

describe Second do
  def raise_an_error
    raise "Oh, this is wrong"
  end

  test "first failure" do
    a = 5
    b = 7
    assert a == b * 2
  end

  test "error" do
    raise_an_error
  end
end

Progress Reporter

Progress Reporter

Description Reporter

Description Reporter

When focus active

describe Focus do
  test "not focused" do
  end

  test! "focused" do
  end

  test "focused too", :focus do
  end
end

Focus

Development

I am using guardian to run the tests on each change. Also the guardian task uses the computer voice to report build/test failure/success. Run bin/build to run tests and generate README.md from README.md.template and generate the images of the test outputs (using an alpine docker image).

DONE

  • hooks (before, after, around), and global ones for e.g. global transactional fixtures
  • Customizable reporters
  • Capture timing info
  • Randomization + configurable seed
  • Reporter: list N slowest tests
  • assert_raises
  • skip
  • Write real tests for Microtest (uses JSON report to check for correct test output). Now tests are green.
  • JSON reporter
  • SummaryRepoter
  • Continuous Integration with Travis
  • focus
  • generate README including examples from specs and terminal screenshots
  • Print whether focus is active
  • crtl+c to halt tests

TODO

  • fail fast
  • Number of assertions
  • Alternatives to nesting? (Use separate describe blocks)
  • Group tests and specify hooks and helper methods for the group only
  • save results to file and compare current results to last results, including timings

Problems

  • Display correct line numbers. This is difficult since macros are used everywhere.
  • Some assertion failures cause segfaults
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.