Feature #220
Updated by kevincolemaninc (kevin coleman) over 8 years ago
=begin 遠藤です。 Ruby 本体にカバレッジ測定機能を提供するのはどうでしょうか。 具体的には、ソースごとの各行の実行回数を表す定数 COVERAGE__ を 導入したいです。SCRIPT_LINES__ のカバレッジ版のようなイメージです。 1. ユーザが COVERAGE__ に {} を設定する 2. ユーザがソースファイルを require や load する 3. COVERAGE__[ファイル名] が各行の実行回数を表す配列を返すようになる (この配列は実行に従って勝手に更新される) ※ COVERAGE__ が設定されなければ何もしません。 ※ 空行など実行される可能性がない行は nil になります。 ※ eval は測定対象にしません。 動作の具体例です。 $ cat foo.rb s = 0 10.times do |x| s += x end if s == 45 p :ok else p :ng end $ ./ruby -e 'COVERAGE__ = {}; require "foo.rb"; p COVERAGE__' :ok {"/home/mame/work/ruby19/ruby/foo.rb"=>[1, 1, 10, nil, nil, 1, 1, nil, 0, nil]} この配列は各行の実行回数を表しています。 上記の仕様を実装したものを添付します。 サンプルとして、lib/coverage.rb を同梱しています。 以下のように使えます。 $ ./ruby -rcoverage foo.rb $ cat foo.rb.cov 1: 0:s = 0 1: 1:10.times do |x| 10: 2: s += x -: 3:end -: 4: 1: 5:if s == 45 1: 6: p :ok -: 7:else #####: 8: p :ng -: 9:end また、RUNRUBYOPT="-rcoverage" make test-all した結果を集計して みました。バグとかで不正確な結果になってる可能性はありますが、 このくらいは動くと言うことで。 $ ./ruby -e ' aan = acn = 0 Dir["{lib,.ext}/**/*.cov"].each do |f| an, cn = File.readlines(f).inject([0, 0]) do |(an, cn), l| next [an, cn] if l.start_with?(" -") an += 1 cn += 1 if !l.start_with?(" #####") [an, cn] end puts "%s %.2f%% (%d/%d)" % [f, cn.to_f * 100 / an, cn, an] aan += an acn += cn end puts "(total) %.2f%% (%d/%d)" % [acn.to_f * 100 / aan, acn, aan] ' lib/drb/unix.rb.cov 86.11% (62/72) lib/drb/drb.rb.cov 81.70% (491/601) lib/drb/eq.rb.cov 100.00% (9/9) lib/drb/ssl.rb.cov 83.90% (99/118) lib/drb/acl.rb.cov 85.71% (66/77) lib/drb/extservm.rb.cov 96.23% (51/53) lib/drb/invokemethod.rb.cov 27.78% (5/18) lib/irb/notifier.rb.cov 75.00% (54/72) lib/irb/output-method.rb.cov 52.00% (13/25) lib/irb/slex.rb.cov 20.39% (31/152) lib/net/https.rb.cov 77.78% (14/18) lib/net/http.rb.cov 87.73% (772/880) lib/net/imap.rb.cov 35.81% (467/1304) lib/net/protocol.rb.cov 59.49% (116/195) lib/rss/content/1.0.rb.cov 100.00% (6/6) lib/rss/content/2.0.rb.cov 100.00% (7/7) lib/rss/1.0.rb.cov 98.08% (204/208) lib/rss/image.rb.cov 96.26% (103/107) lib/rss/syndication.rb.cov 96.55% (28/29) lib/rss/maker/1.0.rb.cov 99.55% (223/224) lib/rss/maker/image.rb.cov 100.00% (58/58) lib/rss/maker/syndication.rb.cov 100.00% (10/10) lib/rss/maker/taxonomy.rb.cov 97.67% (42/43) lib/rss/maker/0.9.rb.cov 98.79% (245/248) lib/rss/maker/2.0.rb.cov 98.45% (127/129) lib/rss/maker/base.rb.cov 98.22% (441/449) lib/rss/maker/dublincore.rb.cov 100.00% (42/42) lib/rss/maker/entry.rb.cov 97.89% (93/95) lib/rss/maker/feed.rb.cov 98.28% (228/232) lib/rss/maker/itunes.rb.cov 97.62% (123/126) lib/rss/maker/slash.rb.cov 100.00% (18/18) lib/rss/maker/atom.rb.cov 98.73% (78/79) lib/rss/maker/trackback.rb.cov 100.00% (31/31) lib/rss/maker/content.rb.cov 100.00% (12/12) lib/rss/taxonomy.rb.cov 98.75% (79/80) lib/rss/rexmlparser.rb.cov 82.14% (23/28) lib/rss/parser.rb.cov 93.00% (279/300) lib/rss/0.9.rb.cov 99.51% (205/206) lib/rss/xmlparser.rb.cov 6.67% (3/45) lib/rss/utils.rb.cov 98.31% (58/59) lib/rss/2.0.rb.cov 100.00% (49/49) lib/rss/dublincore.rb.cov 100.00% (39/39) lib/rss/xml.rb.cov 89.74% (35/39) lib/rss/xml-stylesheet.rb.cov 100.00% (63/63) lib/rss/itunes.rb.cov 91.83% (191/208) lib/rss/rss.rb.cov 93.23% (592/635) lib/rss/slash.rb.cov 100.00% (25/25) lib/rss/atom.rb.cov 99.50% (397/399) lib/rss/dublincore/1.0.rb.cov 100.00% (9/9) lib/rss/dublincore/2.0.rb.cov 100.00% (8/8) lib/rss/dublincore/atom.rb.cov 100.00% (10/10) lib/rss/maker.rb.cov 96.55% (28/29) lib/rss/trackback.rb.cov 100.00% (125/125) lib/rss/xmlscanner.rb.cov 1.64% (1/61) lib/rss/content.rb.cov 100.00% (19/19) lib/rss/converter.rb.cov 30.00% (21/70) lib/uri/ftp.rb.cov 82.46% (47/57) lib/uri/ldaps.rb.cov 100.00% (5/5) lib/uri/https.rb.cov 100.00% (5/5) lib/uri/common.rb.cov 95.07% (135/142) lib/uri/generic.rb.cov 90.04% (416/462) lib/uri/ldap.rb.cov 74.23% (72/97) lib/uri/http.rb.cov 93.33% (14/15) lib/uri/mailto.rb.cov 81.40% (70/86) lib/date/format.rb.cov 35.96% (233/648) lib/rdoc/ri/paths.rb.cov 57.50% (23/40) lib/rdoc/ri/display.rb.cov 81.89% (104/127) lib/rdoc/ri/formatter.rb.cov 69.23% (216/312) lib/rdoc/ri/driver.rb.cov 13.45% (30/223) lib/rdoc/options.rb.cov 31.82% (70/220) lib/rdoc/ri.rb.cov 100.00% (2/2) lib/rdoc/rdoc.rb.cov 32.74% (37/113) lib/rdoc/dot.rb.cov 47.06% (40/85) lib/rdoc/markup.rb.cov 92.86% (117/126) lib/rdoc/tokenstream.rb.cov 58.33% (7/12) lib/rdoc/markup/lines.rb.cov 95.00% (57/60) lib/rdoc/markup/to_flow.rb.cov 49.44% (44/89) lib/rdoc/markup/to_test.rb.cov 100.00% (23/23) lib/rdoc/markup/fragments.rb.cov 95.89% (140/146) lib/rdoc/markup/inline.rb.cov 76.60% (36/47) lib/rdoc/markup/attribute_manager.rb.cov 90.08% (118/131) lib/rdoc/markup/preprocess.rb.cov 24.14% (7/29) lib/rdoc/markup/formatter.rb.cov 83.33% (5/6) lib/rdoc/stats.rb.cov 58.33% (7/12) lib/rdoc/parsers/parse_c.rb.cov 49.80% (125/251) lib/rdoc/parsers/parse_rb.rb.cov 13.46% (178/1322) lib/rdoc/parsers/parse_simple.rb.cov 43.75% (7/16) lib/rdoc/parsers/parse_f95.rb.cov 6.02% (53/881) lib/rdoc/parsers/parserfactory.rb.cov 41.67% (10/24) lib/rdoc/code_objects.rb.cov 57.22% (218/381) lib/rdoc/diagram.rb.cov 10.00% (14/140) lib/test/unit/ui/console/testrunner.rb.cov 92.96% (66/71) lib/test/unit/ui/testrunnermediator.rb.cov 100.00% (32/32) lib/test/unit/ui/testrunnerutilities.rb.cov 66.67% (10/15) lib/test/unit/collector/objectspace.rb.cov 100.00% (18/18) lib/test/unit/collector/dir.rb.cov 95.89% (70/73) lib/test/unit/util/backtracefilter.rb.cov 100.00% (28/28) lib/test/unit/util/observable.rb.cov 100.00% (31/31) lib/test/unit/util/procwrapper.rb.cov 100.00% (12/12) lib/test/unit/failure.rb.cov 95.00% (19/20) lib/test/unit/testcase.rb.cov 91.78% (67/73) lib/test/unit/testsuite.rb.cov 100.00% (31/31) lib/test/unit/collector.rb.cov 100.00% (25/25) lib/test/unit/autorunner.rb.cov 66.94% (81/121) lib/test/unit/testresult.rb.cov 100.00% (30/30) lib/test/unit/error.rb.cov 95.24% (20/21) lib/test/unit/assertions.rb.cov 97.01% (227/234) lib/test/unit/assertionfailederror.rb.cov 100.00% (3/3) lib/test/unit.rb.cov 90.91% (10/11) lib/yaml/rubytypes.rb.cov 74.58% (176/236) lib/yaml/syck.rb.cov 100.00% (6/6) lib/yaml/store.rb.cov 95.83% (23/24) lib/yaml/tag.rb.cov 88.89% (16/18) lib/yaml/stream.rb.cov 61.11% (11/18) lib/yaml/constants.rb.cov 100.00% (15/15) lib/yaml/types.rb.cov 49.02% (50/102) lib/yaml/ypath.rb.cov 92.59% (25/27) lib/yaml/error.rb.cov 100.00% (18/18) lib/yaml/basenode.rb.cov 15.38% (16/104) lib/tempfile.rb.cov 79.59% (78/98) lib/rdoc.rb.cov 100.00% (11/11) lib/fileutils.rb.cov 81.93% (544/664) lib/rexml/node.rb.cov 44.44% (16/36) lib/rexml/rexml.rb.cov 100.00% (7/7) lib/rexml/attribute.rb.cov 72.22% (52/72) lib/rexml/streamlistener.rb.cov 100.00% (16/16) lib/rexml/parseexception.rb.cov 28.57% (8/28) lib/rexml/syncenumerator.rb.cov 50.00% (7/14) lib/rexml/undefinednamespaceexception.rb.cov 80.00% (4/5) lib/rexml/encodings/UTF-8.rb.cov 100.00% (10/10) lib/rexml/encodings/ICONV.rb.cov 100.00% (13/13) lib/rexml/text.rb.cov 47.13% (74/157) lib/rexml/xpath_parser.rb.cov 33.78% (125/370) lib/rexml/functions.rb.cov 27.39% (43/157) lib/rexml/encoding.rb.cov 73.33% (33/45) lib/rexml/validation/validationexception.rb.cov 80.00% (4/5) lib/rexml/source.rb.cov 54.92% (67/122) lib/rexml/document.rb.cov 68.75% (55/80) lib/rexml/xpath.rb.cov 80.65% (25/31) lib/rexml/formatters/pretty.rb.cov 22.22% (16/72) lib/rexml/formatters/default.rb.cov 78.43% (40/51) lib/rexml/element.rb.cov 45.36% (181/399) lib/rexml/doctype.rb.cov 37.60% (47/125) lib/rexml/instruction.rb.cov 56.25% (18/32) lib/rexml/attlistdecl.rb.cov 60.00% (12/20) lib/rexml/entity.rb.cov 52.94% (45/85) lib/rexml/parsers/baseparser.rb.cov 61.00% (183/300) lib/rexml/parsers/xpathparser.rb.cov 45.59% (181/397) lib/rexml/parsers/streamparser.rb.cov 83.33% (20/24) lib/rexml/parsers/treeparser.rb.cov 51.72% (30/58) lib/rexml/xmldecl.rb.cov 80.88% (55/68) lib/rexml/comment.rb.cov 51.85% (14/27) lib/rexml/output.rb.cov 61.54% (8/13) lib/rexml/cdata.rb.cov 55.00% (11/20) lib/rexml/xmltokens.rb.cov 100.00% (9/9) lib/rexml/parent.rb.cov 58.67% (44/75) lib/rexml/namespace.rb.cov 81.82% (18/22) lib/rexml/child.rb.cov 70.00% (21/30) lib/rinda/tuplespace.rb.cov 66.67% (152/228) lib/rinda/rinda.rb.cov 67.47% (56/83) lib/delegate.rb.cov 54.44% (49/90) lib/ostruct.rb.cov 58.93% (33/56) lib/pathname.rb.cov 83.97% (309/368) lib/pp.rb.cov 41.95% (146/348) lib/open-uri.rb.cov 18.48% (61/330) lib/e2mmap.rb.cov 68.29% (28/41) lib/rubygems/source_index.rb.cov 94.12% (208/221) lib/rubygems/ext/rake_builder.rb.cov 90.91% (10/11) lib/rubygems/ext/ext_conf_builder.rb.cov 100.00% (8/8) lib/rubygems/ext/builder.rb.cov 100.00% (27/27) lib/rubygems/ext/configure_builder.rb.cov 100.00% (8/8) lib/rubygems/spec_fetcher.rb.cov 96.23% (102/106) lib/rubygems/dependency_list.rb.cov 86.76% (59/68) lib/rubygems/command_manager.rb.cov 85.39% (76/89) lib/rubygems/package.rb.cov 64.81% (35/54) lib/rubygems/server.rb.cov 78.66% (129/164) lib/rubygems/exceptions.rb.cov 100.00% (28/28) lib/rubygems/command.rb.cov 90.18% (147/163) lib/rubygems/source_info_cache.rb.cov 93.20% (137/147) lib/rubygems/rubygems_version.rb.cov 100.00% (2/2) lib/rubygems/install_update_options.rb.cov 94.74% (36/38) lib/rubygems/source_info_cache_entry.rb.cov 91.30% (21/23) lib/rubygems/security.rb.cov 72.99% (100/137) lib/rubygems/version.rb.cov 98.25% (56/57) lib/rubygems/remote_fetcher.rb.cov 90.28% (130/144) lib/rubygems/config_file.rb.cov 94.12% (112/119) lib/rubygems/dependency.rb.cov 95.12% (39/41) lib/rubygems/local_remote_options.rb.cov 97.73% (43/44) lib/rubygems/digest/md5.rb.cov 50.00% (4/8) lib/rubygems/digest/sha2.rb.cov 66.67% (4/6) lib/rubygems/digest/sha1.rb.cov 66.67% (4/6) lib/rubygems/commands/mirror_command.rb.cov 14.55% (8/55) lib/rubygems/commands/fetch_command.rb.cov 85.71% (30/35) lib/rubygems/commands/outdated_command.rb.cov 100.00% (19/19) lib/rubygems/commands/pristine_command.rb.cov 95.00% (38/40) lib/rubygems/commands/unpack_command.rb.cov 89.74% (35/39) lib/rubygems/commands/dependency_command.rb.cov 89.58% (86/96) lib/rubygems/commands/server_command.rb.cov 94.12% (16/17) lib/rubygems/commands/cert_command.rb.cov 100.00% (45/45) lib/rubygems/commands/update_command.rb.cov 64.84% (59/91) lib/rubygems/commands/specification_command.rb.cov 88.10% (37/42) lib/rubygems/commands/generate_index_command.rb.cov 41.18% (7/17) lib/rubygems/commands/stale_command.rb.cov 93.75% (15/16) lib/rubygems/commands/contents_command.rb.cov 91.89% (34/37) lib/rubygems/commands/build_command.rb.cov 96.55% (28/29) lib/rubygems/commands/sources_command.rb.cov 92.41% (73/79) lib/rubygems/commands/query_command.rb.cov 98.33% (118/120) lib/rubygems/commands/install_command.rb.cov 81.67% (49/60) lib/rubygems/commands/check_command.rb.cov 33.33% (14/42) lib/rubygems/commands/uninstall_command.rb.cov 66.67% (22/33) lib/rubygems/commands/environment_command.rb.cov 95.45% (42/44) lib/rubygems/uninstaller.rb.cov 15.46% (15/97) lib/rubygems/installer.rb.cov 97.99% (195/199) lib/rubygems/indexer.rb.cov 14.88% (25/168) lib/rubygems/defaults.rb.cov 80.95% (17/21) lib/rubygems/builder.rb.cov 91.67% (33/36) lib/rubygems/format.rb.cov 92.59% (25/27) lib/rubygems/gem_runner.rb.cov 51.61% (16/31) lib/rubygems/package/tar_writer.rb.cov 98.89% (89/90) lib/rubygems/package/tar_input.rb.cov 79.81% (83/104) lib/rubygems/package/tar_reader/entry.rb.cov 100.00% (50/50) lib/rubygems/package/tar_header.rb.cov 100.00% (63/63) lib/rubygems/package/f_sync_dir.rb.cov 85.71% (6/7) lib/rubygems/package/tar_output.rb.cov 86.27% (44/51) lib/rubygems/package/tar_reader.rb.cov 84.62% (33/39) lib/rubygems/gem_openssl.rb.cov 67.86% (19/28) lib/rubygems/ext.rb.cov 100.00% (6/6) lib/rubygems/user_interaction.rb.cov 83.19% (99/119) lib/rubygems/dependency_installer.rb.cov 93.75% (105/112) lib/rubygems/require_paths_builder.rb.cov 40.00% (4/10) lib/rubygems/version_option.rb.cov 100.00% (17/17) lib/rubygems/platform.rb.cov 94.57% (87/92) lib/rubygems/requirement.rb.cov 100.00% (61/61) lib/rubygems/gem_path_searcher.rb.cov 100.00% (19/19) lib/rubygems/test_utilities.rb.cov 100.00% (54/54) lib/rubygems/doc_manager.rb.cov 63.16% (48/76) lib/rubygems/specification.rb.cov 90.23% (397/440) lib/rubygems/validator.rb.cov 35.96% (32/89) lib/date.rb.cov 48.27% (307/636) lib/singleton.rb.cov 24.44% (33/135) lib/prettyprint.rb.cov 39.55% (157/397) lib/timeout.rb.cov 70.73% (29/41) lib/set.rb.cov 91.18% (186/204) lib/rubygems.rb.cov 91.90% (261/284) lib/erb.rb.cov 95.47% (274/287) lib/webrick.rb.cov 100.00% (17/17) lib/tmpdir.rb.cov 60.38% (32/53) lib/shellwords.rb.cov 77.78% (28/36) lib/monitor.rb.cov 87.65% (71/81) lib/rss.rb.cov 100.00% (12/12) lib/thread.rb.cov 76.86% (93/121) lib/open3.rb.cov 59.26% (16/27) lib/pstore.rb.cov 72.47% (129/178) lib/find.rb.cov 82.61% (19/23) lib/xmlrpc/config.rb.cov 100.00% (10/10) lib/xmlrpc/server.rb.cov 48.29% (113/234) lib/xmlrpc/create.rb.cov 78.18% (86/110) lib/xmlrpc/parser.rb.cov 51.20% (213/416) lib/xmlrpc/utils.rb.cov 57.58% (38/66) lib/xmlrpc/datetime.rb.cov 100.00% (36/36) lib/xmlrpc/marshal.rb.cov 100.00% (29/29) lib/xmlrpc/client.rb.cov 57.14% (100/175) lib/xmlrpc/base64.rb.cov 80.00% (12/15) lib/uri.rb.cov 100.00% (11/11) lib/forwardable.rb.cov 75.00% (15/20) lib/optparse.rb.cov 77.87% (482/619) lib/yaml.rb.cov 72.53% (66/91) lib/webrick/config.rb.cov 100.00% (13/13) lib/webrick/server.rb.cov 77.31% (92/119) lib/webrick/httprequest.rb.cov 90.53% (220/243) lib/webrick/utils.rb.cov 90.72% (88/97) lib/webrick/compat.rb.cov 100.00% (4/4) lib/webrick/httpauth/digestauth.rb.cov 14.78% (30/203) lib/webrick/httpauth/basicauth.rb.cov 86.11% (31/36) lib/webrick/httpauth/htpasswd.rb.cov 93.33% (42/45) lib/webrick/httpauth/htdigest.rb.cov 26.92% (14/52) lib/webrick/httpauth/htgroup.rb.cov 27.27% (9/33) lib/webrick/httpauth/authenticator.rb.cov 86.96% (40/46) lib/webrick/httpauth/userdb.rb.cov 80.00% (8/10) lib/webrick/version.rb.cov 100.00% (2/2) lib/webrick/log.rb.cov 84.78% (39/46) lib/webrick/httpservlet.rb.cov 100.00% (9/9) lib/webrick/https.rb.cov 69.70% (23/33) lib/webrick/httpproxy.rb.cov 83.77% (129/154) lib/webrick/httputils.rb.cov 78.50% (168/214) lib/webrick/ssl.rb.cov 60.29% (41/68) lib/webrick/htmlutils.rb.cov 100.00% (10/10) lib/webrick/httpservlet/filehandler.rb.cov 80.59% (191/237) lib/webrick/httpservlet/prochandler.rb.cov 100.00% (11/11) lib/webrick/httpservlet/abstract.rb.cov 71.43% (25/35) lib/webrick/httpservlet/cgihandler.rb.cov 80.88% (55/68) lib/webrick/httpservlet/erbhandler.rb.cov 38.46% (10/26) lib/webrick/httpserver.rb.cov 87.68% (121/138) lib/webrick/httpversion.rb.cov 90.00% (18/20) lib/webrick/httpstatus.rb.cov 88.10% (37/42) lib/webrick/httpauth.rb.cov 95.45% (21/22) lib/webrick/httpresponse.rb.cov 67.93% (125/184) lib/webrick/cookie.rb.cov 92.54% (62/67) lib/webrick/accesslog.rb.cov 82.93% (34/41) lib/logger.rb.cov 79.69% (153/192) lib/cgi.rb.cov 17.86% (115/644) lib/scanf.rb.cov 98.43% (188/191) lib/ipaddr.rb.cov 78.35% (181/231) lib/time.rb.cov 38.83% (160/412) lib/English.rb.cov 100.00% (25/25) lib/tsort.rb.cov 57.75% (41/71) lib/rational.rb.cov 100.00% (10/10) .ext/common/io/nonblock.rb.cov 64.29% (9/14) .ext/common/json/add/core.rb.cov 97.83% (45/46) .ext/common/json/add/rails.rb.cov 42.86% (9/21) .ext/common/json/version.rb.cov 100.00% (7/7) .ext/common/json/common.rb.cov 64.71% (77/119) .ext/common/json/ext.rb.cov 100.00% (8/8) .ext/common/openssl.rb.cov 100.00% (6/6) .ext/common/ripper.rb.cov 100.00% (4/4) .ext/common/digest/hmac.rb.cov 90.24% (37/41) .ext/common/digest/sha2.rb.cov 46.43% (13/28) .ext/common/ripper/lexer.rb.cov 60.56% (43/71) .ext/common/ripper/sexp.rb.cov 90.48% (19/21) .ext/common/ripper/filter.rb.cov 41.67% (10/24) .ext/common/ripper/core.rb.cov 93.75% (15/16) .ext/common/kconv.rb.cov 94.29% (66/70) .ext/common/json.rb.cov 77.78% (7/9) .ext/common/openssl/x509.rb.cov 83.33% (70/84) .ext/common/openssl/ssl.rb.cov 95.65% (88/92) .ext/common/openssl/cipher.rb.cov 81.82% (18/22) .ext/common/openssl/buffering.rb.cov 83.09% (113/136) .ext/common/openssl/bn.rb.cov 83.33% (5/6) .ext/common/openssl/digest.rb.cov 95.24% (20/21) .ext/common/digest.rb.cov 58.33% (14/24) (total) 66.40% (23543/35456) ご検討お願いします。 -- Yusuke ENDOH <mame@tsg.ne.jp> Attachment: coverage.patch =end