oktest 1.1.1 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5232c4c9a9bf78763791cf182129900a376d1dd619fbf4a21f441ea10c0a7f27
4
- data.tar.gz: 1d35a5ec4678e1a80624c058a32647cc6013c6a3dc4f87f3590bea2a226ea412
3
+ metadata.gz: 829638b6c9703b023e61adfdef426e7ddb206f2ba93775143b8ae39c86b0f381
4
+ data.tar.gz: f4d70f1272398f74b0abaad9bd0ea027ca557a8860c44d6f11f056a60d89fc4c
5
5
  SHA512:
6
- metadata.gz: 385ddc6a48f39657c38ee43ade9c89677aa686f8e7f55ec90eb9aef7d9dbec795cea55014e48070a22a18b63daea081863a4c6c0afc3c1d24c33316a70fcd149
7
- data.tar.gz: ea3d7947b5195db3cdfd7a435adbdf0d96edfcfc0a653b67d7a241d4dec3e479c986fe8fc8294427e3c05343681b2308474131a35e5e62b75d1214660e62599e
6
+ metadata.gz: 5669eea2d32e6d0ecdfdd263a50e9a740fd6e2da081bbc0e35d433796d242507341bccc53c2c6ca7cd5a26d0b55a7c8222da5fb15eca27945a1207222c4ee32d
7
+ data.tar.gz: 8cdce5238153c774972ac26bf6b389786b920a41c8d4d2069df03d17e80ebdd299be83a63d44f7840088482b3e05e35019fdf0804a57c1273e93cde14a9a547e
data/README.md CHANGED
@@ -43,7 +43,7 @@ Oktest.scope do #
43
43
  end #
44
44
  ```
45
45
 
46
- Oktest.rb requires Ruby 2.3 or later.
46
+ Oktest.rb requires Ruby 2.0 or later.
47
47
 
48
48
 
49
49
 
@@ -74,6 +74,7 @@ Oktest.rb requires Ruby 2.3 or later.
74
74
  * <a href="#at_end-crean-up-handler"><code>at_end()</code>: Crean-up Handler</a>
75
75
  * <a href="#named-fixtures">Named Fixtures</a>
76
76
  * <a href="#fixture-injection">Fixture Injection</a>
77
+ * <a href="#fixture-keyword-argument"><code>fixture:</code> keyword argument</a>
77
78
  * <a href="#global-scope">Global Scope</a>
78
79
  * <a href="#helpers">Helpers</a>
79
80
  * <a href="#capture_sio"><code>capture_sio()</code></a>
@@ -83,6 +84,7 @@ Oktest.rb requires Ruby 2.3 or later.
83
84
  * <a href="#dummy_attrs"><code>dummy_attrs()</code></a>
84
85
  * <a href="#dummy_ivars"><code>dummy_ivars()</code></a>
85
86
  * <a href="#recorder"><code>recorder()</code></a>
87
+ * <a href="#partial_regexp"><code>partial_regexp()</code></a>
86
88
  * <a href="#json-matcher">JSON Matcher</a>
87
89
  * <a href="#simple-example">Simple Example</a>
88
90
  * <a href="#nested-example">Nested Example</a>
@@ -91,6 +93,7 @@ Oktest.rb requires Ruby 2.3 or later.
91
93
  * <a href="#tips">Tips</a>
92
94
  * <a href="#ok--in-minitest"><code>ok {}</code> in MiniTest</a>
93
95
  * <a href="#testing-rack-application">Testing Rack Application</a>
96
+ * <a href="#environment-variale-oktest_rb">Environment Variale <code>$OKTEST_RB</code></a>
94
97
  * <a href="#traverser-class">Traverser Class</a>
95
98
  * <a href="#benchmarks">Benchmarks</a>
96
99
  * <a href="#--faster-option"><code>--faster</code> Option</a>
@@ -115,7 +118,7 @@ $ oktest --help
115
118
  $ mkdir test
116
119
 
117
120
  ### create test script
118
- $ oktest --create > test/example_test.rb
121
+ $ oktest --skeleton > test/example_test.rb
119
122
  $ less test/example_test.rb
120
123
 
121
124
  ### run test script
@@ -1232,12 +1235,42 @@ end
1232
1235
  -->
1233
1236
 
1234
1237
 
1238
+ ### `fixture:` keyword argument
1239
+
1240
+ `scope()` takes `fixture:` keyword argument which overwrites fixture value.
1241
+
1242
+ test/example26_test.rb:
1243
+
1244
+ ```ruby
1245
+ require 'oktest'
1246
+
1247
+ Oktest.scope do
1248
+
1249
+ fixture :user do |uname, uid: 101| # `uid` is keyword param
1250
+ {name: uname, id: uid}
1251
+ end
1252
+
1253
+ fixture :uname do
1254
+ "Alice"
1255
+ end
1256
+
1257
+ ## keyword argument `fixture:` overwrites fixture values
1258
+ spec "example", fixture: {uname: "Bob", uid: 201} do # !!!!!
1259
+ |user|
1260
+ ok {user[:name]} == "Bob" # != "Alice"
1261
+ ok {user[:id]} == 201 # != 101
1262
+ end
1263
+
1264
+ end
1265
+ ```
1266
+
1267
+
1235
1268
  ### Global Scope
1236
1269
 
1237
1270
  It is a good idea to separate common fixtures into dedicated file.
1238
1271
  In this case, use `Oktest.global_scope()` instead of `Oktest.scope()`.
1239
1272
 
1240
- test/common_fixtures.rb:
1273
+ test/example27_test.rb:
1241
1274
 
1242
1275
  ```ruby
1243
1276
  require 'oktest'
@@ -1611,6 +1644,124 @@ end
1611
1644
  ```
1612
1645
 
1613
1646
 
1647
+ ### `partial_regexp()`
1648
+
1649
+ `partial_regexp()` can embed regexp pattern into string, and compile it into Regexp object. This is very useful to validate multiline string with regexp.
1650
+
1651
+ Assume that you are testing the following function `f1()`. It generates multiline string containing date and random string.
1652
+
1653
+ ```ruby
1654
+ def f1()
1655
+ today = Date.today.to_s # ex: '2021-12-31'
1656
+ secret = Random.bytes(8).unpack('H*')[0] # ex: "cd0b260ac728eda5"
1657
+ return <<END
1658
+ * [config.date] #{today}
1659
+ * [config.secret] #{secret}
1660
+ END
1661
+ end
1662
+ ```ruby
1663
+
1664
+ To test `f1()`, you may write the following test code.
1665
+ As you can see, expected regexp literal is complicated.
1666
+
1667
+ ```ruby
1668
+ topic 'f1()' do
1669
+ spec "generates multiline string." do
1670
+ expected = /\A\* \[config\.date\] \d\d\d\d-\d\d-\d\d\n\* \[config\.secret\] [0-9a-f]+\n/
1671
+ ok {f1()} =~ expected
1672
+ end
1673
+ end
1674
+ ```
1675
+
1676
+ [`x` option](https://ruby-doc.org/core-2.7.0/Regexp.html#class-Regexp-label-Free-Spacing+Mode+and+Comments) of regexp (such as `/.../x`) allows you to write regexp literal in multiline format.
1677
+ But you have to escape metachars (`*`, `.`, `[]`, and white space).
1678
+
1679
+ ```ruby
1680
+ topic 'f1()' do
1681
+ spec "generates multiline string." do
1682
+ expected = /\A
1683
+ \*\ \[config\.date\]\ \ \ \d\d\d\d-\d\d-\d\d\n
1684
+ \*\ \[config\.secret\]\ [0-9a-f]+\n
1685
+ \z/x # !!!!!
1686
+ ok {f1()} =~ expected
1687
+ end
1688
+ end
1689
+ ```
1690
+
1691
+ In such case, `partial_regexp()` is very useful. It compiles string into Regexp object.
1692
+ Using `partial_regexp()`, you can write expected regexp very easily.
1693
+
1694
+ ```ruby
1695
+ topic 'f1()' do
1696
+ spec "generates multiline string." do
1697
+ # - Regexp can be in `{== ==}`.
1698
+ # - Other text part is escaped by `Regexp.escape()`.
1699
+ expected = partial_regexp <<'END' # !!!!!
1700
+ * [config.date] {== \d\d\d\d-\d\d-\d\d ==}
1701
+ * [config.secret] {== [0-9a-f]+ ==}
1702
+ END
1703
+ ok {f1()} =~ expected
1704
+ ## above is equivarent to:
1705
+ #expected = /\A
1706
+ #\*\ \[config\.date\]\ \ \ \d\d\d\d-\d\d-\d\d\n
1707
+ #\*\ \[config\.secret\]\ [0-9a-f]+\n
1708
+ #\z/x # !!!!!
1709
+ #ok {f1()} =~ expected
1710
+ end
1711
+ end
1712
+ ```
1713
+
1714
+ `partial_regexp()` takes 4 arguments.
1715
+
1716
+ ```ruby
1717
+ def partial_regexp(pattern, begin_='\A', end_='\z', mark='{== ==}')
1718
+ ```
1719
+
1720
+ `partial_regexp()` adds `\A` and `\z` automatically.
1721
+ If you want not to add them, pass empty string or nil as 2nd and 3rd argument, like this:
1722
+
1723
+ ```ruby
1724
+ partial_regexp <<-'END', '', '' # !!!!!
1725
+ ...
1726
+ END
1727
+ ```
1728
+
1729
+ If you want to change embed mark, specify 4th argument, like this:
1730
+
1731
+ ```ruby
1732
+ partial_regexp <<-'END', '\A', '\z', '%%(.*?)%%' # !!!!!
1733
+ * [config.date] %% \d\d\d\d-\d\d-\d\d %%
1734
+ * [config.secret] %% [0-9a-f]+ %%
1735
+ END
1736
+ ```
1737
+
1738
+ Oktest.rb provides `partial_regexp!()`, too.
1739
+ Difference between `partial_regexp()` and `partial_regexp!()` is the result of `#inspect()`.
1740
+ This is imortant only when assertion failed and error message reported.
1741
+ You can use whichever you like.
1742
+
1743
+ ```ruby
1744
+ r1 = partial_regexp <<-'END'
1745
+ * [config.date] {== \d\d\d\d-\d\d-\d\d ==}
1746
+ * [config.secret] {== [0-9a-f]+ ==}
1747
+ END
1748
+ p r1
1749
+ #=> /\A
1750
+ # \*\ \[config\.date\]\ \ \ \d\d\d\d-\d\d-\d\d\n
1751
+ # \*\ \[config\.secret\]\ [0-9a-f]+\n
1752
+ # \z/x
1753
+
1754
+ r2 = partial_regexp! <<-'END' # !!!!!
1755
+ * [config.date] {== \d\d\d\d-\d\d-\d\d ==}
1756
+ * [config.secret] {== [0-9a-f]+ ==}
1757
+ END
1758
+ p r2
1759
+ #=> partial_regexp(<<PREXP, '\A', '\z')
1760
+ # * [config.date] {== \d\d\d\d-\d\d-\d\d ==}
1761
+ # * [config.secret] {== [0-9a-f]+ ==}
1762
+ # PREXP
1763
+ ```
1764
+
1614
1765
 
1615
1766
  ## JSON Matcher
1616
1767
 
@@ -1922,6 +2073,20 @@ end
1922
2073
  ```
1923
2074
 
1924
2075
 
2076
+ ### Environment Variale `$OKTEST_RB`
2077
+
2078
+ You can set default command-line option to environment variale `$OKTEST_RB`.
2079
+ For examle, you can specify default reporting style with `$OKTEST_RB`.
2080
+
2081
+ ```terminal
2082
+ ### change default reporting style to plain-style.
2083
+ $ export OKTEST_RB="-s plain" # !!!!!
2084
+
2085
+ ### run test script in plain-style reporting without '-s' option.
2086
+ $ ruby test/foo_test.rb
2087
+ ```
2088
+
2089
+
1925
2090
  ### Traverser Class
1926
2091
 
1927
2092
  Oktest.rb provides `Traverser` class which implements Visitor pattern.
@@ -2001,12 +2166,12 @@ Oktest.rb gem file contains benchmark script.
2001
2166
  It shows that Oktest.rb runs more than three times faster than RSpec.
2002
2167
 
2003
2168
  ```terminal
2004
- $ gem install oktest # ver 1.0.0
2169
+ $ gem install oktest # ver 1.2.0
2005
2170
  $ gem install rspec # ver 3.10.0
2006
2171
  $ gem install minitest # ver 5.14.4
2007
2172
  $ gem install test-unit # ver 3.4.4
2008
2173
 
2009
- $ cp -pr $GEM_HOME/gems/oktest-1.0.0/benchmark .
2174
+ $ cp -pr $GEM_HOME/gems/oktest-1.2.0/benchmark .
2010
2175
  $ cd benchmark/
2011
2176
  $ rake -T
2012
2177
  $ ruby --version
@@ -2018,47 +2183,57 @@ $ rake benchmark:all
2018
2183
  Example result:
2019
2184
 
2020
2185
  ```
2021
- ==================== oktest ====================
2186
+ ==================== {{*oktest*}} ====================
2022
2187
  oktest -sq run_all.rb
2023
2188
 
2024
- ## total:100000 (pass:100000, fail:0, error:0, skip:0, todo:0) in 4.86s
2189
+ ## total:100000 (pass:100000, fail:0, error:0, skip:0, todo:0) in 2.36s
2025
2190
 
2026
- 8.536 real 8.154 user 0.245 sys
2191
+ {{*6.815 real*}} 6.511 user 0.257 sys
2027
2192
 
2028
- ==================== oktest:faster ====================
2193
+ ==================== {{*oktest:faster*}} ====================
2029
2194
  oktest -sq --faster run_all.rb
2030
2195
 
2031
- ## total:100000 (pass:100000, fail:0, error:0, skip:0, todo:0) in 1.64s
2196
+ ## total:100000 (pass:100000, fail:0, error:0, skip:0, todo:0) in 2.01s
2032
2197
 
2033
- 5.068 real 4.819 user 0.202 sys
2198
+ {{*6.401 real*}} 6.123 user 0.240 sys
2034
2199
 
2035
- ==================== rspec ====================
2200
+ ==================== {{*rspec*}} ====================
2036
2201
  rspec run_all.rb | tail -4
2037
2202
 
2038
- Finished in 14.44 seconds (files took 15.81 seconds to load)
2203
+ Finished in 15.27 seconds (files took 16.08 seconds to load)
2039
2204
  100000 examples, 0 failures
2040
2205
 
2041
2206
 
2042
- 30.798 real 26.565 user 4.392 sys
2207
+ {{*32.062 real*}} 27.778 user 4.383 sys
2043
2208
 
2044
- ==================== minitest ====================
2209
+ ==================== {{*minitest*}} ====================
2045
2210
  ruby run_all.rb | tail -4
2046
2211
 
2047
- Finished in 5.190405s, 19266.3193 runs/s, 19266.3193 assertions/s.
2212
+ Finished in 5.281425s, 18934.2838 runs/s, 37868.5677 assertions/s.
2048
2213
 
2049
- 100000 runs, 100000 assertions, 0 failures, 0 errors, 0 skips
2214
+ 100000 runs, 200000 assertions, 0 failures, 0 errors, 0 skips
2050
2215
 
2051
- 8.767 real 8.157 user 0.761 sys
2216
+ {{*9.140 real*}} 8.657 user 0.705 sys
2052
2217
 
2053
- ==================== testunit ====================
2218
+ ==================== {{*testunit*}} ====================
2054
2219
  ruby run_all.rb | tail -5
2055
2220
  -------------------------------------------------------------------------------
2056
- 100000 tests, 100000 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
2221
+ 100000 tests, 200000 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
2057
2222
  100% passed
2058
2223
  -------------------------------------------------------------------------------
2059
- 8957.19 tests/s, 8957.19 assertions/s
2224
+ 7775.59 tests/s, 15551.18 assertions/s
2060
2225
 
2061
- 17.838 real 17.201 user 0.879 sys
2226
+ {{*19.580 real*}} 19.020 user 0.885 sys
2227
+ ```
2228
+
2229
+ Summary:
2230
+
2231
+ ```
2232
+ Oktest: 6.815 real 6.511 user 0.257 sys
2233
+ Oktest (--fast): 6.401 real 6.123 user 0.240 sys
2234
+ RSpec: 32.062 real 27.778 user 4.383 sys
2235
+ MiniTest: 9.140 real 8.657 user 0.705 sys
2236
+ Test::Unit: 19.580 real 19.020 user 0.885 sys
2062
2237
  ```
2063
2238
 
2064
2239
 
data/Rakefile.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
3
  ###
4
- ### $Release: 1.1.1 $
4
+ ### $Release: 1.2.0 $
5
5
  ### $Copyright: copyright(c) 2011-2021 kuwata-lab.com all rights reserved $
6
6
  ### $License: MIT License $
7
7
  ###
@@ -37,6 +37,8 @@ How to release:
37
37
  $ git add -p CHANGES.md
38
38
  $ git commit -m "ruby: update 'CHANGES.md'"
39
39
  $ git log -1
40
+ $ cid=$(git log -1 | awk 'NR==1{print $2}')
41
+ $ echo $cid
40
42
  $ rake package RELEASE=#{rel}
41
43
  $ rake package:extract # confirm files in gem file
42
44
  $ pushd #{proj}-#{rel}/data; find . -type f; popd
@@ -48,7 +50,8 @@ How to release:
48
50
  $ git push --tags
49
51
  $ rake clean
50
52
  $ git checkout ruby
51
- $ git cherry-pick xxxxxxxxx # cherry-pick update of CHANGES.md
53
+ $ git log -1 $cid
54
+ $ git cherry-pick $cid # cherry-pick update of CHANGES.md
52
55
  END
53
56
  end
54
57
 
@@ -29,6 +29,7 @@ Oktest.scope do
29
29
  <% for k in 1..nspecs %>
30
30
  spec "#<%= k %>: 1+1 should be 2" do
31
31
  ok {1+1} == 2
32
+ ok {1+1} == 2
32
33
  end
33
34
  <% end %>
34
35
 
@@ -54,6 +55,7 @@ RSpec.describe "Example #<%= i %>" do
54
55
  <% for k in 1..nspecs %>
55
56
  it "#<%= k %>: 1+1 should be 2" do
56
57
  expect(1+1).to eq 2
58
+ expect(1+1).to eq 2
57
59
  end
58
60
  <% end %>
59
61
 
@@ -80,6 +82,7 @@ describe "Example #<%= i %>" do
80
82
  <% for k in 1..nspecs %>
81
83
  it "#<%= k %>: 1+1 should be 2" do
82
84
  assert_equal 2, 1+1
85
+ assert_equal 2, 1+1
83
86
  end
84
87
  <% end %>
85
88
 
@@ -107,6 +110,7 @@ class Example_<%= n %>_<%= i %>_TC < Test::Unit::TestCase
107
110
  def test_<%= n %>_<%= i %>_<%= j %>_<%= k %>()
108
111
  #assert 1+1 == 2
109
112
  assert_equal 2, 1+1
113
+ assert_equal 2, 1+1
110
114
  end
111
115
  <% end %>
112
116