我已经下载了一个大型项目(Whiley),并希望跟踪项目JUnit测试期间执行的每个方法。
有6个模块,它们主要相互依赖。
我目前正在尝试使用Eclipse AspectJ插件来运行单个模块。
我的方面J路径设置
AspectJ编织代码并在/ bin文件夹中生成wyc的编译版本。
但是,当我尝试通过CLI运行JUnit测试的.class文件时。
使用以下声明:
java -cp "C:\Users\name\git\WhileyCompiler\lib\junit-4.11.jar";"C:\Users\name\git\WhileyCompiler\lib\*.jar";"C:\Users\name\git\WhileyCompiler\lib\hamcrest-all-1.3.jar" org.junit.runner.JUnitCore "C:\Users\name\git\Test\bin\wyc\testing\AllValidTests.class"
我得到以下内容:
我的方面文件
pointcut traceMethods() : (execution(* *(..))&& !cflow(within(Trace)));
before(): traceMethods(){
Signature sig = thisJoinPointStaticPart.getSignature();
String line =""+ thisJoinPointStaticPart.getSourceLocation().getLine();
String sourceName = thisJoinPointStaticPart.getSourceLocation().getWithinType().getCanonicalName();
service.addMethodCall(sourceName);
Logger.getLogger("Tracing").log(
Level.INFO,
"Call from "
+ sourceName
+" line " +
line
+" to " +sig.getDeclaringTypeName() + "." + sig.getName()
);
}
答案 0 :(得分:2)
有四点需要注意:
*.jar
,只需使用*
作为通配符,请参阅this answer。以下是如何在您的案例中运行JUnit的示例。我添加了换行符,以使其更具可读性,所有内容都需要在一行:
java
-cp
"C:\Users\name\git\WhileyCompiler\lib\junit-4.11.jar";
"C:\Users\name\git\WhileyCompiler\lib\*";
"C:\Users\name\git\WhileyCompiler\lib\hamcrest-all-1.3.jar";
"C:\Users\name\git\WhileyCompiler\lib\aspectjrt.jar";
"C:\Users\name\git\Test\bin"
org.junit.runner.JUnitCore
wyc.testing.AllValidTests
<强>更新强>
实际上本周我很忙,但我只是在这里用LTW快速尝试二进制JAR,但*.whiley
测试文件解压缩。它很好用,我在控制台上看到日志输出。我不得不改变你的切入点,因为当所有加载的框架类(例如来自JUnit)也被编织时,它会导致LTW场景中的膨胀输出。我还简化了你的方面,以便直接在System.out
上提供格式化输出而不是所有带时间戳的日志记录开销,因为我发现它更具可读性。
修改后的方面:
package de.scrum_master.aspect;
public aspect TraceAspect {
pointcut traceMethods() :
execution(* *(..)) && (within(whiley..*) || within(wy*..*));
before() : traceMethods() {
System.out.printf(
"%40s | %s%n",
thisJoinPoint.getSourceLocation(),
thisJoinPoint.getSignature()
);
}
}
控制台输出:
JUnit version 4.11
. AllValidTests.java:2729 | void wyc.testing.AllValidTests.TypeEquals_Valid_1()
AllValidTests.java:97 | void wyc.testing.AllValidTests.runTest(String)
TestUtils.java:28 | Pair wyc.testing.TestUtils.compile(String[])
Pipeline.java:292 | void wycc.lang.Pipeline.register(Class)
Pipeline.java:292 | void wycc.lang.Pipeline.register(Class)
Pipeline.java:292 | void wycc.lang.Pipeline.register(Class)
Pipeline.java:292 | void wycc.lang.Pipeline.register(Class)
Pipeline.java:292 | void wycc.lang.Pipeline.register(Class)
Pipeline.java:292 | void wycc.lang.Pipeline.register(Class)
Pipeline.java:292 | void wycc.lang.Pipeline.register(Class)
Pipeline.java:292 | void wycc.lang.Pipeline.register(Class)
Content.java:135 | Content.Filter wyfs.lang.Content.filter(String, Content.Type)
Trie.java:238 | Trie wyfs.util.Trie.fromString(String)
Trie.java:193 | Trie wyfs.util.Trie.append(String)
Trie.java:312 | int wyfs.util.Trie.binarySearch(Trie[], int, String)
Content.java:135 | Content.Filter wyfs.lang.Content.filter(String, Content.Type)
Trie.java:238 | Trie wyfs.util.Trie.fromString(String)
Trie.java:193 | Trie wyfs.util.Trie.append(String)
Trie.java:312 | int wyfs.util.Trie.binarySearch(Trie[], int, String)
Content.java:135 | Content.Filter wyfs.lang.Content.filter(String, Content.Type)
Trie.java:238 | Trie wyfs.util.Trie.fromString(String)
Trie.java:193 | Trie wyfs.util.Trie.append(String)
Trie.java:312 | int wyfs.util.Trie.binarySearch(Trie[], int, String)
VirtualRoot.java:50 | VirtualRoot.Folder wyfs.util.VirtualRoot.root()
VirtualRoot.java:50 | VirtualRoot.Folder wyfs.util.VirtualRoot.root()
VirtualRoot.java:50 | VirtualRoot.Folder wyfs.util.VirtualRoot.root()
WycMain.java:179 | int wyc.WycMain.run(String[])
OptArg.java:322 | Map wycc.util.OptArg.parseOptions(List, OptArg[])
OptArg.java:218 | void wycc.util.OptArg.FILEDIR.process(String, String, Map)
OptArg.java:231 | void wycc.util.OptArg.FILELIST.process(String, String, Map)
WycMain.java:258 | void wyc.WycMain.configure(Map)
WycBuildTask.java:331 | void wyc.util.WycBuildTask.setVerbose(boolean)
WycBuildTask.java:335 | void wyc.util.WycBuildTask.setVerification(boolean)
WycBuildTask.java:343 | void wyc.util.WycBuildTask.setSmtVerification(boolean)
WycBuildTask.java:339 | void wyc.util.WycBuildTask.setVerificationConditions(boolean)
WycBuildTask.java:359 | void wyc.util.WycBuildTask.setWhileyDir(File)
DirectoryRoot.java:135 | DirectoryRoot.Folder wyfs.util.DirectoryRoot.root()
DirectoryRoot.java:135 | DirectoryRoot.Folder wyfs.util.DirectoryRoot.root()
WycBuildTask.java:399 | void wyc.util.WycBuildTask.setBootPath(List)
... | ...
答案 1 :(得分:1)
我认为问题出在你提供给JUnit的论证中。让我们转到带有编译类的文件夹并运行命令:
java -cp "(classpath here)" org.junit.runner.JUnitCore wyc.testing.AllValidTests
如果我没记错的话,提供的参数必须是类名, NOT 编译文件的路径。