Java プロジェクトの特定のパッケージのテスト カバレッジの平均を計算する簡単な手順を書きました。巨大な html ファイルの生データは次のようになります。
<body>
package pkg1 <line_coverage>11/111,<branch_coverage>44/444<end>
package pkg2 <line_coverage>22/222,<branch_coverage>55/555<end>
package pkg3 <line_coverage>33/333,<branch_coverage>66/666<end>
...
</body>
たとえば、パッケージ「pkg1」と「pkg3」が指定されている場合、平均的な回線範囲は次のようになります。
(11+33)/(111+333)
平均支店カバレッジは次のとおりです。
(44+66)/(444+666)
結果を得るために次の手順を書きましたが、うまく機能します。しかし、この計算を機能的なスタイルで実装するにはどうすればよいでしょうか? 「(x,y) for x in ... for b in ... if...」のようなもの。Erlang、Haskell、Clojure を少し知っているので、これらの言語でのソリューションも歓迎します。どうもありがとう!
from __future__ import division
import re
datafile = ('abc', 'd>11/23d>34/89d', 'e>25/65e>13/25e', 'f>36/92f>19/76')
core_pkgs = ('d', 'f')
covered_lines, total_lines, covered_branches, total_branches = 0, 0, 0, 0
for line in datafile:
for pkg in core_pkgs:
ptn = re.compile('.*'+pkg+'.*'+'>(\d+)/(\d+).*>(\d+)/(\d+).*')
match = ptn.match(line)
if match is not None:
cvln, tlln, cvbh, tlbh = match.groups()
covered_lines += int(cvln)
total_lines += int(tlln)
covered_branches += int(cvbh)
total_branches += int(tlbh)
print 'Line coverage:', '{:.2%}'.format(covered_lines / total_lines)
print 'Branch coverage:', '{:.2%}'.format(covered_branches/total_branches)