microtest

forked from Ragmaanir/microtest
Smaller test framework, because it has power asserts as the only assertion.

microtest Build StatusDependency Status

Version 1.2.0

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.0

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
Repository

microtest

Owner
Statistic
  • 0
  • 0
  • 0
  • 2
  • 0
  • over 6 years ago
  • May 31, 2018
License

MIT License

Links
Synced at

Thu, 21 Nov 2024 03:11:52 GMT

Languages