2

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)
4

3 に答える 3

1

コードに適用された、すぐにハッキングされた、テストされていないアイデアを次に示します。

import numpy as np
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 pkg in core_pkgs:
    ptn = re.compile('.*'+pkg+'.*'+'>(\d+)/(\d+).*>(\d+)/(\d+).*')
    matches = map(datafile, ptn.match)
    statsList = [map(int, match.groups()) for match in matches if matches]
    # statsList is a list of [cvln, tlln, cvbh, tlbh]
    stats = np.array(statsList)
    covered_lines, total_lines, covered_branches, total_branches = stats.sum(axis=1)

ご覧のとおり、残りのループを終わらせようとはしていませんが、要点はここまでだと思います。これを行う方法は確かに複数あります。私は誇示することを選択しましたmap()(これにより効率が低下すると言う人もいますが、おそらくそうです)、および (確かに軽い) 計算を行うために NumPy を使用しました。

于 2013-09-29T10:16:39.307 に答える