micro_test 0.0.7 → 0.0.8
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/README.md +20 -3
- data/lib/micro_test/runner.rb +78 -0
- data/lib/micro_test/test.rb +43 -0
- data/lib/micro_test.rb +4 -83
- metadata +3 -1
data/README.md
CHANGED
@@ -2,15 +2,14 @@
|
|
2
2
|
|
3
3
|
### Testing should be simple.
|
4
4
|
|
5
|
-
|
6
|
-
the slippery slope of feature creep and eventually become an end unto themselves.
|
5
|
+
Testing frameworks never seem to resist the slippery slope of feature creep and eventually become an end unto themselves.
|
7
6
|
MiniTest is a step in the right direction, but still feels bigger than it should.
|
8
7
|
|
9
8
|
#### MicroTest is an experiment to see just how simple a testing "framework" can be.
|
10
9
|
|
11
10
|
## Features
|
12
11
|
|
13
|
-
* __Opinionated & small__ - _only
|
12
|
+
* __Opinionated & small__ - _only 100 lines of code_
|
14
13
|
* __Only one assertion: `assert`__ - _since this is the heart of testing_
|
15
14
|
* __Tests run in random order__ - _to prevent the bad practice of run order depenencies_
|
16
15
|
* __Plays nice with others__ - _easy to introduce to an existing codebase_
|
@@ -25,6 +24,8 @@ gem install micro_test
|
|
25
24
|
|
26
25
|
* Tests subclass `MicroTest::Test`
|
27
26
|
* Define tests with `test "description" do ...`
|
27
|
+
* Setup with `before [:all|:each] do ...`
|
28
|
+
* Teardown with `after [:all|:each] do ...`
|
28
29
|
* Assert statements with `assert [statement]`
|
29
30
|
* Run tests from the terminal with `$mt /path/to/test_file_or_dir` or simply `$mt`
|
30
31
|
* Run tests from Ruby with `MicroTest::Runner.run`
|
@@ -39,6 +40,14 @@ Define a test.
|
|
39
40
|
# /example/test/math_test.rb
|
40
41
|
class MathTest < MicroTest::Test
|
41
42
|
|
43
|
+
before :all do
|
44
|
+
# runs once before all tests
|
45
|
+
end
|
46
|
+
|
47
|
+
before :each do
|
48
|
+
# runs before each test
|
49
|
+
end
|
50
|
+
|
42
51
|
test "addition" do
|
43
52
|
assert 2 + 2 == 4
|
44
53
|
end
|
@@ -60,6 +69,14 @@ class MathTest < MicroTest::Test
|
|
60
69
|
assert 2 + 2 == 5
|
61
70
|
end
|
62
71
|
|
72
|
+
after :each do
|
73
|
+
# runs after each test
|
74
|
+
end
|
75
|
+
|
76
|
+
after :all do
|
77
|
+
# runs once after all tests
|
78
|
+
end
|
79
|
+
|
63
80
|
end
|
64
81
|
```
|
65
82
|
|
@@ -0,0 +1,78 @@
|
|
1
|
+
module MicroTest
|
2
|
+
module Runner
|
3
|
+
class << self
|
4
|
+
|
5
|
+
def red(text)
|
6
|
+
"\e[31m#{text}\e[0m"
|
7
|
+
end
|
8
|
+
|
9
|
+
def green(text)
|
10
|
+
"\e[32m#{text}\e[0m"
|
11
|
+
end
|
12
|
+
|
13
|
+
def update(event, arg)
|
14
|
+
send event, arg
|
15
|
+
end
|
16
|
+
|
17
|
+
def add_test_class(klass)
|
18
|
+
test_classes << klass
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_classes
|
22
|
+
@test_classes ||= []
|
23
|
+
end
|
24
|
+
|
25
|
+
def file(path)
|
26
|
+
@files ||= {}
|
27
|
+
@files[path] ||= File.open(path, "r").readlines.map { |l| l.gsub(/\n/, "") }
|
28
|
+
end
|
29
|
+
|
30
|
+
def file_info(callstack_entry)
|
31
|
+
path = callstack_entry[0, callstack_entry.index(/:[0-9]+:/)]
|
32
|
+
file = file(path)
|
33
|
+
line_num = callstack_entry.scan(/:[0-9]+:/).first.gsub(/:/, "").to_i
|
34
|
+
line = file[line_num - 1]
|
35
|
+
{
|
36
|
+
:path => path,
|
37
|
+
:file => file,
|
38
|
+
:line => line,
|
39
|
+
:line_num => line_num
|
40
|
+
}
|
41
|
+
end
|
42
|
+
|
43
|
+
def assert(value)
|
44
|
+
info = file_info(caller[6])
|
45
|
+
if value
|
46
|
+
puts " #{green :PASS}: #{info[:line]}"
|
47
|
+
@passed += 1
|
48
|
+
else
|
49
|
+
puts " #{red :FAIL}: #{red info[:line]}"
|
50
|
+
puts " #{info[:path]}:#{info[:line_num]}"
|
51
|
+
@failed += 1
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def run
|
56
|
+
@passed = @failed = 0
|
57
|
+
@test_classes.shuffle.each do |test_class|
|
58
|
+
before = test_class.callbacks[:before]
|
59
|
+
after = test_class.callbacks[:after]
|
60
|
+
|
61
|
+
puts test_class.name
|
62
|
+
before[:all].call if before[:all]
|
63
|
+
test_class.tests.keys.shuffle.each do |desc|
|
64
|
+
before[:each].call if before[:each]
|
65
|
+
puts "- test #{desc}"
|
66
|
+
test_class.tests[desc].call
|
67
|
+
after[:each].call if after[:each]
|
68
|
+
end
|
69
|
+
after[:all].call if after[:all]
|
70
|
+
end
|
71
|
+
puts "---"
|
72
|
+
puts "Passed: #{green @passed}, Failed: #{red @failed}"
|
73
|
+
puts "---"
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require "observer"
|
2
|
+
|
3
|
+
module MicroTest
|
4
|
+
class Test
|
5
|
+
class << self
|
6
|
+
include Observable
|
7
|
+
|
8
|
+
def inherited(subclass)
|
9
|
+
notify(:add_test_class, subclass)
|
10
|
+
end
|
11
|
+
|
12
|
+
def notify(event, arg)
|
13
|
+
MicroTest::Test.send :changed
|
14
|
+
MicroTest::Test.send :notify_observers, event, arg
|
15
|
+
end
|
16
|
+
|
17
|
+
def callbacks
|
18
|
+
@callbacks ||= { :before => {}, :after => {} }
|
19
|
+
end
|
20
|
+
|
21
|
+
def before(what, &block)
|
22
|
+
callbacks[:before][what] = block
|
23
|
+
end
|
24
|
+
|
25
|
+
def after(what, &block)
|
26
|
+
callbacks[:after][what] = block
|
27
|
+
end
|
28
|
+
|
29
|
+
def tests
|
30
|
+
@tests ||= {}
|
31
|
+
end
|
32
|
+
|
33
|
+
def test(desc, &block)
|
34
|
+
tests[desc] = block
|
35
|
+
end
|
36
|
+
|
37
|
+
def assert(value)
|
38
|
+
notify(:assert, value)
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/lib/micro_test.rb
CHANGED
@@ -1,84 +1,5 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
path = File.expand_path(File.join(File.dirname(__FILE__), "micro_test"))
|
2
|
+
require File.join(path, "test")
|
3
|
+
require File.join(path, "runner")
|
3
4
|
|
4
|
-
|
5
|
-
"\e[31m#{text}\e[0m"
|
6
|
-
end
|
7
|
-
|
8
|
-
def self.green(text)
|
9
|
-
"\e[32m#{text}\e[0m"
|
10
|
-
end
|
11
|
-
|
12
|
-
def self.test_classes
|
13
|
-
@test_classes ||= []
|
14
|
-
end
|
15
|
-
|
16
|
-
def self.log(value)
|
17
|
-
file_path = caller[1][0, caller[1].index(/:[0-9]+:/)]
|
18
|
-
line_num = caller[1].scan(/:[0-9]+:/).first.gsub(/:/, "").to_i
|
19
|
-
@files ||= {}
|
20
|
-
@files[file_path] ||= File.open(file_path, "r").readlines.map { |l| l.gsub(/\n/, "") }
|
21
|
-
line = @files[file_path][line_num - 1].strip
|
22
|
-
|
23
|
-
if value
|
24
|
-
puts " #{green :PASS}: #{line}"
|
25
|
-
@passed += 1
|
26
|
-
else
|
27
|
-
puts " #{red :FAIL}: #{red line}"
|
28
|
-
puts " #{file_path}:#{line_num}"
|
29
|
-
@failed += 1
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
def self.run
|
34
|
-
@passed = @failed = 0
|
35
|
-
test_classes.shuffle.each do |test_class|
|
36
|
-
before = test_class.callbacks[:before]
|
37
|
-
after = test_class.callbacks[:after]
|
38
|
-
|
39
|
-
puts test_class.name
|
40
|
-
before[:all].call if before[:all]
|
41
|
-
test_class.tests.keys.shuffle.each do |desc|
|
42
|
-
before[:each].call if before[:each]
|
43
|
-
puts "- test #{desc}"
|
44
|
-
test_class.tests[desc].call
|
45
|
-
after[:each].call if after[:each]
|
46
|
-
end
|
47
|
-
after[:all].call if after[:all]
|
48
|
-
end
|
49
|
-
puts "---"
|
50
|
-
puts "Passed: #{green @passed}, Failed: #{red @failed}"
|
51
|
-
puts "---"
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
class Test
|
56
|
-
def self.inherited(subclass)
|
57
|
-
MicroTest::Runner.test_classes << subclass
|
58
|
-
end
|
59
|
-
|
60
|
-
def self.callbacks
|
61
|
-
@callbacks ||= { :before => {}, :after => {} }
|
62
|
-
end
|
63
|
-
|
64
|
-
def self.before(what, &block)
|
65
|
-
callbacks[:before][what] = block
|
66
|
-
end
|
67
|
-
|
68
|
-
def self.after(what, &block)
|
69
|
-
callbacks[:after][what] = block
|
70
|
-
end
|
71
|
-
|
72
|
-
def self.tests
|
73
|
-
@tests ||= {}
|
74
|
-
end
|
75
|
-
|
76
|
-
def self.test(desc, &block)
|
77
|
-
tests[desc] = block
|
78
|
-
end
|
79
|
-
|
80
|
-
def self.assert(value)
|
81
|
-
MicroTest::Runner.log(value)
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
5
|
+
MicroTest::Test.add_observer MicroTest::Runner
|
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.0.
|
4
|
+
version: 0.0.8
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -21,6 +21,8 @@ executables:
|
|
21
21
|
extensions: []
|
22
22
|
extra_rdoc_files: []
|
23
23
|
files:
|
24
|
+
- lib/micro_test/runner.rb
|
25
|
+
- lib/micro_test/test.rb
|
24
26
|
- lib/micro_test.rb
|
25
27
|
- bin/mt
|
26
28
|
- README.md
|