micro_test 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source :rubygems
2
+
3
+ gem "slop"
4
+ gem "pry"
data/Gemfile.lock ADDED
@@ -0,0 +1,17 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ coderay (1.0.7)
5
+ method_source (0.8)
6
+ pry (0.9.10)
7
+ coderay (~> 1.0.5)
8
+ method_source (~> 0.8)
9
+ slop (~> 3.3.1)
10
+ slop (3.3.3)
11
+
12
+ PLATFORMS
13
+ ruby
14
+
15
+ DEPENDENCIES
16
+ pry
17
+ slop
data/README.md CHANGED
@@ -1,40 +1,77 @@
1
1
  # MicroTest
2
2
 
3
- ### Testing should be simple.
3
+ ## Ruby's no-nonsense testing framework
4
4
 
5
- Testing frameworks never seem to resist the slippery slope of feature creep and eventually become an end unto themselves.
6
- MiniTest is a step in the right direction, but still feels bigger than it should.
5
+ [View the product page for prettier docs.](http://hopsoft.github.com/micro_test/)
7
6
 
8
- #### MicroTest is an experiment to see just how simple a testing "framework" can be.
7
+ Testing frameworks often lose their focus and become an end unto themselves.
8
+ MicroTest avoids this pitfall with a relentless focus on simplicity.
9
9
 
10
- ## Features
10
+ ### Testing should be simple
11
11
 
12
- * __Opinionated & small__ - _only 100 lines of code_
13
- * __Only one assert method: `assert`__ - _since this is the heart of testing_
14
- * __Tests run in random order__ - _to prevent the bad practice of run order depenencies_
15
- * __Plays nice with others__ - _easy to introduce to an existing codebase_
12
+ Here's what MicroTest brings to the table.
16
13
 
17
- ## Install
14
+ * __Simplicity__
15
+ A tiny API with only 4 methods. You'll be up and running faster than ever before.
16
+ * __Only 1 Assert Method__
17
+ Forget the copious expections and assert methods from other frameworks and start focusing on what really matters.
18
+ * __Small Footprint__
19
+ Weighs in around 140 lines of code. Less code means less to learn and less that can go wrong.
20
+ * __Plays Nice__
21
+ Runs side by side with other test frameworks which makes it easy to integrate into existing projects.
22
+ * __Random Run Order__
23
+ Prevents the bad practice of run order dependencies by running tests in random order.
24
+ * __Customizable
25
+ Output__ Customize test output with pluggable formatters, or give back by writing your own.
26
+
27
+ ## Quick Start
28
+
29
+ 1. Install
18
30
 
19
31
  ```bash
20
- gem install micro_test
32
+ $ gem install micro_test
33
+ ```
34
+
35
+ 2. Write a test
36
+
37
+ ```ruby
38
+ require 'micro_test'
39
+ class MyTest < MicroTest::Test
40
+ test "some assumption" do
41
+ assert true
42
+ end
43
+ end
44
+ ```
45
+
46
+ 3. Run tests
47
+
48
+ ```bash
49
+ $ mt
21
50
  ```
22
51
 
23
- ## API
52
+ ## The interface
24
53
 
25
- * Tests should subclass `MicroTest::Test`
26
- * Define tests with `test "description" do ...`
27
- * Setup with `before [:all|:each] do ...`
28
- * Teardown with `after [:all|:each] do ...`
29
- * Assert statements with `assert [statement]`
30
- * Run tests from the terminal with `$ mt`
31
- * Run tests from Ruby with `MicroTest::Runner.run`
54
+ * `MicroTest::Test` Superclass for all tests.
55
+ * `test(desc, &block)` Defines a test method.
56
+ * `desc` - a description of what is being tested
57
+ * `&block` - a block of code which defines the test
32
58
 
33
- That's all there is to learn.
59
+ * `assert(value)` Verifies the truthiness of a value.
60
+ * `value` - the value to assert
34
61
 
35
- ## Examples
62
+ * `before(what, &block)` A callback that runs before the specified 'what'.
63
+ * `what` - indicates the callback type
64
+ * `:all` - runs before all tests in the class
65
+ * `:each` - runse before each test in the class
66
+ * `&block` - the block of code to execute
36
67
 
37
- Define a test.
68
+ * `after(what, &block)` A callback that runs after the specified 'what'.
69
+ * `what` - indicates the callback type
70
+ * `:all` - runs after all tests in the class
71
+ * `:each` - runse after each test in the class
72
+ * `&block` - the block of code to execute
73
+
74
+ ## Example
38
75
 
39
76
  ```ruby
40
77
  # /example/test/math_test.rb
@@ -80,24 +117,9 @@ class MathTest < MicroTest::Test
80
117
  end
81
118
  ```
82
119
 
83
- Run all tests in the "test" directory _(relative to the current directory)_.
120
+ Run tests.
84
121
 
85
122
  ```bash
86
123
  $ mt
87
- ```
88
-
89
- Run all tests in a directory.
90
-
91
- ```bash
92
124
  $ mt /example/test
93
- ```
94
-
95
- Run all tests in a file.
96
-
97
- ```bash
98
125
  $ mt /example/test/math_test.rb
99
- ```
100
-
101
- Test output.
102
-
103
- ![MicroTest output](http://hopsoft.github.com/micro_test/images/micro_test.png)
data/bin/mt CHANGED
@@ -1,28 +1,44 @@
1
1
  #!/usr/bin/env ruby
2
-
2
+ require "slop"
3
+ require "pry"
3
4
  require File.expand_path(File.join(File.dirname(__FILE__), "..", "lib", "micro_test"))
4
5
 
5
- path = ARGV[0].to_s.strip
6
- path = File.join(Dir.pwd, "test") if path.empty?
7
-
8
- if path == "-h" || path == "--help"
9
- puts "Runs MicroTest on the provided path."
10
- puts "Usage:"
11
- puts " $mt /path/to/test_file_or_dir"
12
- exit
6
+ opts = Slop.parse(:strict => true, :help => true) do
7
+ banner "mt [options]"
8
+ on :p, :path, "The path to the test directory or file.", :argument => true
9
+ on :f, :formatter, "The name of the formatter to use.", :argument => true
10
+ on :pry, "Starts a pry session when tests fail or have errors."
13
11
  end
14
12
 
13
+ exit if opts[:help]
14
+
15
+ path = opts[:path] || "test"
15
16
  path = File.join(Dir.pwd, path) unless path =~ /^\//
16
17
  unless File.exist?(path)
17
18
  puts "#{path} not found."
18
19
  puts "Please check the path and try again."
19
20
  exit
20
21
  end
21
-
22
- if File.directory?(path)
23
- Dir[File.join(path, "**", "*.rb")].each { |p| require p }
24
- else
22
+ if path =~ /\.rb$/
25
23
  require path
24
+ else
25
+ Dir[File.join(path, "**", "*.rb")].each { |p| require p }
26
+ end
27
+
28
+ formatter_name = opts[:formatter] || "default"
29
+ formatter_path = File.expand_path(File.join(File.dirname(__FILE__), "..", "lib", "formatters", formatter_name + ".rb"))
30
+ unless File.exist?(formatter_path)
31
+ puts "#{formatter_path} not found."
32
+ puts "Please check the formatter name and try again."
33
+ exit
34
+ end
35
+ begin
36
+ require File.expand_path(File.join(File.dirname(__FILE__), "..", "lib", "formatters", formatter_name))
37
+ formatter = MicroTest.const_get("Formatter").new
38
+ rescue Exception => ex
39
+ puts "Failed to load the formatter."
40
+ puts ex.message
41
+ exit
26
42
  end
27
43
 
28
- MicroTest::Runner.run
44
+ MicroTest::Runner.run formatter, :pry => !!opts[:pry]
@@ -1,5 +1,6 @@
1
1
  module MicroTest
2
2
  class Formatter
3
+
3
4
  def initialize
4
5
  @total = 0
5
6
  @passed = 0
@@ -18,13 +19,19 @@ module MicroTest
18
19
  @total += 1
19
20
  info[:passed] ? @passed += 1 : @failed += 1
20
21
  print "- #{info[:name]} "
21
- info[:asserts].each do |assert|
22
- if assert[:pass]
23
- puts green(:PASS)
22
+ if info[:passed]
23
+ puts green(:PASS)
24
+ else
25
+ if info[:error]
26
+ puts "#{red :ERROR} #{red info[:error].message}"
27
+ puts " #{red info[:error].backtrace[0]}"
24
28
  else
25
29
  puts red(:FAIL)
26
- puts " #{red assert[:line]}"
27
- puts " #{red assert[:path]}:#{yellow assert[:line_num]}"
30
+ info[:asserts].each do |assert|
31
+ next if assert[:passed]
32
+ puts " #{red assert[:line]}"
33
+ puts " #{red assert[:path]}:#{yellow assert[:line_num]}"
34
+ end
28
35
  end
29
36
  end
30
37
  end
@@ -1,5 +1,3 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), "formatter"))
2
-
3
1
  module MicroTest
4
2
  module Runner
5
3
  class << self
@@ -8,10 +6,6 @@ module MicroTest
8
6
  send event, arg
9
7
  end
10
8
 
11
- def formatter
12
- @formatter ||= MicroTest::Formatter.new
13
- end
14
-
15
9
  def add_test_class(klass)
16
10
  test_classes << klass
17
11
  end
@@ -22,7 +16,7 @@ module MicroTest
22
16
 
23
17
  def file(path)
24
18
  @files ||= {}
25
- @files[path] ||= File.open(path, "r").readlines.map { |l| l.gsub(/\n/, "") }
19
+ @files[path] ||= File.read(path).split("\n")
26
20
  end
27
21
 
28
22
  def file_info(callstack_entry)
@@ -40,11 +34,10 @@ module MicroTest
40
34
 
41
35
  def assert(value)
42
36
  @failed ||= !value
43
- @asserts << file_info(caller[6]).merge(:pass => value)
37
+ @asserts << file_info(caller[6]).merge(:passed => value)
44
38
  end
45
39
 
46
- def run(f=nil)
47
- @formatter = f
40
+ def run(formatter, opts={})
48
41
  formatter.header
49
42
 
50
43
  test_classes.shuffle.each do |test_class|
@@ -55,8 +48,14 @@ module MicroTest
55
48
  @failed = false
56
49
  @asserts = []
57
50
  test_class.invoke :before, :each
58
- test_class.tests[desc].call
59
- formatter.test(:name => desc, :passed => !@failed, :asserts => @asserts)
51
+ begin
52
+ test_class.tests[desc].call
53
+ rescue Exception => e
54
+ @failed = true
55
+ error = e
56
+ end
57
+ test_class.tests[desc].pry if @failed && opts[:pry]
58
+ formatter.test :name => desc, :passed => !@failed, :asserts => @asserts, :error => error
60
59
  test_class.invoke :after, :each
61
60
  end
62
61
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: micro_test
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,42 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-09-27 00:00:00.000000000 Z
13
- dependencies: []
14
- description: ! ' A tiny testing framework.
15
-
16
- '
12
+ date: 2012-10-02 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: slop
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: pry
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ description: ! " Testing frameworks often lose their focus and become an end unto
47
+ themselves.\n MicroTest avoids this pitfall with a relentless focus on simplicity.\n"
17
48
  email:
18
49
  - natehop@gmail.com
19
50
  executables:
@@ -21,11 +52,13 @@ executables:
21
52
  extensions: []
22
53
  extra_rdoc_files: []
23
54
  files:
24
- - lib/micro_test/formatter.rb
55
+ - lib/formatters/default.rb
25
56
  - lib/micro_test/runner.rb
26
57
  - lib/micro_test/test.rb
27
58
  - lib/micro_test.rb
28
59
  - bin/mt
60
+ - Gemfile
61
+ - Gemfile.lock
29
62
  - README.md
30
63
  homepage: http://hopsoft.github.com/micro_test/
31
64
  licenses:
@@ -51,5 +84,5 @@ rubyforge_project:
51
84
  rubygems_version: 1.8.24
52
85
  signing_key:
53
86
  specification_version: 3
54
- summary: A tiny testing framework.
87
+ summary: Ruby's no-nonsense testing framework.
55
88
  test_files: []