6

既存の Ant ビルド スクリプト内で Java Web アプリ コードを難読化しようとしていますが、単体テストに関する問題が発生しています。コードがコンパイルされた直後、jar される前、および単体テストが実行される前に、コードを難読化しています。

ただし、テスト コードではなく実稼働コードを難読化すると、難読化ツールによって名前が変更されたために存在しなくなったメソッドを呼び出そうとするため、すべてのテストが失敗します。特定のメソッドを難読化しないようにマークして、テスト スイートなどの外部システムで使用できるようにすることができます

テスト クラスも難読化すると、次の 2 つの問題が発生します。

1: 本番クラスとテスト クラスが同じ出力ディレクトリにマージされ、本番 .jar ファイルからテスト クラスを除外できません。

2: 通常の Ant バッチテスト コールを実行できません。

 <batchtest todir="${basedir}/reports">
      <fileset dir="${basedir}/components/common/build-zkm">
           <include name="**/*Test.class"/>
      </fileset>
 </batchtest>

難読化ツールがテストの名前を変更したためです。

結果の .war/.ear ファイルに対して難読化ツールを実行することもできますが、難読化ツールによって引き起こされたバグを排除するために、変更されたコードに対して単体テストを実行したいと考えています。

私は現在、Zelix KlassMaster を使用していますが、まだ評価段階にあるので、他のオプションがより適切に機能する場合は、それを受け入れます。

4

3 に答える 3

7

私はyguardを使用しています(無料なので、言及しています)。

特定のものを難読化しないように難読化ツールに指示できるはずです (ここを見るとできるようです)。

他の人が言ったように、テストを難読化しないものもありますが、残りは難読化します。

ただし、次のことを行うことをお勧めします。

  1. コンパイル
  2. 難読化されていないファイルをjarします(必要な場合)
  3. 難読化されていないファイルをテストする
  4. テストに合格した場合は、難読化されたファイルを難読化します
  5. 難読化されたファイルをテストする

遅くなりますが、ステップ 3 でテストが失敗した場合は (潜在的に) 修正が容易になり、テストが 5 で失敗した場合は、ソース コードではなく難読化に問題があることがわかります。

于 2009-03-20T21:03:21.767 に答える
3

テストからの参照を含むコードを効果的にリファクタリングするように難読化ツールを実行するように指示できますか(つまり、製品名が変更されると、テスト コードはその参照を変更します)、テスト自体を難読化しないように (つまり、テストクラスまたはそのメソッドの名前)? 難読化ツールの以前の経験を考えると、それがうまくいくと思います。

たとえば、難読化されていない次のソースがあるとします。

public class ProductionCode
{
    public void productionMethod() {}
}

public class ProductionCodeTest
{
    public void testProductionMethod()
    {
        new ProductionCode().productionMethod();
    }
}

難読化ツールのオプションを設定して、効果的にする必要があります。

public class Xyzzy
{
    public void ababa() {}
}

public class ProductionCodeTest
{
    public void testProductionMethod()
    {
        new Xyzzy(). ababa();
    }
}

そうすれば、テストの API は変更されておらず、メソッドの実装のみであるため、「テストを実行する」Ant タスクは同じままである必要があります。

于 2009-03-20T20:31:27.367 に答える
0

難読化ツールは、パブリックコールを変更しないでください。難読化後に変更されるべきではない内部機能をチェックするため、難読化の前に他のテストを実行する必要があるようです。

その場合は、パブリック機能を呼び出すテストを実行してみませんか?あなたがする必要があるのは、それらの呼び出しで別のクラスを持ち、難読化されたコードを使用してそれを再構築し、次にそのdllを実行することです。

于 2009-03-20T20:55:00.197 に答える