我希望在现有的Ant构建脚本中混淆我们的Java Web应用程序代码,但是遇到了有关单元测试的问题。我在代码编译之后,在jar编辑之前和运行单元测试之前混淆了代码。
但是,如果我混淆了我的生产代码而不是我的测试代码,那么我的所有测试都会失败,因为他们试图调用不再存在的方法,因为它们已被混淆器重命名。我可以将某些方法标记为不混淆,以便外部系统(例如我们的测试套件)可以使用它们,但由于我们正在为高单位测试覆盖率进行拍摄,我们需要将所有的方法标记为un -obfuscatable。
如果我也对测试类进行模糊处理,我会遇到两个问题:
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合作,但我仍处于评估阶段,所以如果他们能够更好地工作,我会对其他选项持开放态度。
答案 0 :(得分:7)
我使用yguard(它是免费的,这就是我提到它的原因)。
你应该能够告诉混淆器不要混淆某些东西(看起来你似乎here)。
正如其他人所说的那样,不要混淆测试,但要对其余部分进行模糊处理。
但是,我建议您执行以下操作:
它会慢一些,但是如果测试在步骤3中失败,那么修复(可能)会更容易,如果测试在5时失败,那么你就知道混淆是一个问题而不是你的源代码。
答案 1 :(得分: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没有改变 - 只是方法的实现。
答案 2 :(得分:0)
混淆器不应更改您的公共呼叫。似乎你应该在混淆之前运行其他测试,因为它们会检查在混淆之后不应该改变的内部功能。
那么如果是这样的话,为什么不运行调用公共功能的测试呢?你需要做的只是有一个单独的类与这些调用,并使用混淆的代码重新构建它,然后运行该DLL。