清单 5. 判定包依赖关系违背
private boolean isEfferentsValid(String layer, Collection rules,
boolean rulesCorrect, JavaPackage jPackage, String analyzedPackageName) {
Collection efferents = jPackage.getEfferents();
Iterator efferentItor = efferents.iterator();
while (efferentItor.hasNext()) {
JavaPackage efferentPackage = (JavaPackage) efferentItor.next();
String efferentPackageName = efferentPackage.getName();
for (Iterator it = rules.iterator(); it.hasNext();) {
String value = (String) it.next();
if (analyzedPackageName.equals(layer)
&& efferentPackageName.equals(value)) {
rulesCorrect = false;
System.out.println("TEST FAILURE: "
+ analyzedPackageName
+ " should not depend upon (have an efferent coupling to) "
+ efferentPackageName);
break;
}
}
}
return rulesCorrect;
}
正如您所看到的,清单 2 到 5 实际上都是扫描一系列包以确定耦合变化;如果耦合发生了变化,失败条件被触发,因此 JUnit 报告测试失败。要让我说的话,这真是令人印象深刻!
别忘了自动运行测试
一旦您结合使用 JUnit 和 JDepend 编写好基于约束的测试后,您就能够用诸如 Ant 或 Maven 这样的工具把它作为构建过程的一部分运行。举例而言,清单 6 阐述了用 Ant 运行一系列此类测试。 test.dependency.dir 属性映射到 root/src/test/java/dependency 目录,其中包含了一些神奇的架构验证程序。
清单 6. 运行依赖性约束测试的 Ant 脚本
<target name="run-tests" depends="compile-tests">
<mkdir dir="${logs.junit.dir}" />
<junit fork="yes" haltonfailure="true" dir="${basedir}" printsummary="yes">
<classpath refid="test.class.path" />
<classpath refid="project.class.path"/>
<formatter type="plain" usefile="true" />
<formatter type="xml" usefile="true" />
<batchtest fork="yes" todir="${logs.junit.dir}">
<fileset dir="${test.dependency.dir}">
<patternset refid="test.sources.pattern"/>
</fileset>
</batchtest>
</junit>
</target>
要使 JUnit 测试成功执行,JDepend JAR 必须出现在 Ant 的类路径中。 haltonfailure 属性被设为 true,以便让构建过程在测试失败时停止。
文章来源于领测软件测试网 https://www.ltesting.net/