6

我希望在我们现有的 Ant 构建脚本中混淆我们的 Java Web 应用程序代码,但在单元测试方面遇到了问题。我在代码编译后、在 jar-ed 之前以及在运行单元测试之前对代码进行了混淆。

但是,如果我混淆了我的生产代码而不是我的测试代码,我的所有测试都会失败,因为它们试图调用不再存在的方法,因为它们已被混淆器重命名。我可以将某些方法标记为不混淆,以便外部系统(例如我们的测试套件)使用它们,但是由于我们正在为高单元测试覆盖率而努力,因此我们需要将所有方法标记为不可混淆。

如果我也混淆测试类,我会遇到两个问题:

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. 如果他们通过测试然后混淆 jar 混淆文件
  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();
    }
}

这样,您的“运行测试”Ant 任务应该能够保持不变,因为测试的 API 没有改变——只是方法的实现。

于 2009-03-20T20:31:27.367 回答
0

混淆器不应更改您的公开电话。似乎你应该在混淆之前运行其他测试,因为它们检查在混淆之后不应该改变的内部功能。

那么如果是这样的话,为什么不直接运行调用公共功能的测试呢?您需要做的就是拥有一个带有这些调用的单独类,并使用混淆代码重新构建它,然后运行该 dll。

于 2009-03-20T20:55:00.197 回答