AspectJ与JUnit通过inpathing主项目进行测试

时间:2015-03-21 02:53:52

标签: java junit aspectj

我已经下载了一个大型项目(Whiley),并希望跟踪项目JUnit测试期间执行的每个方法。

有6个模块,它们主要相互依赖。

我目前正在尝试使用Eclipse AspectJ插件来运行单个模块。

我的方面J路径设置

Inpath Settings

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"

我得到以下内容:

Error

我的方面文件

    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()
    );
}

2 个答案:

答案 0 :(得分:2)

有四点需要注意:

  • 用户HoàngLong是对的,您需要指定一个完全限定的类名而不是JUnit跑步者的路径。
  • 这也意味着您需要将测试类的路径添加到类路径中。
  • 在类路径中,您无法使用*.jar,只需使用*作为通配符,请参阅this answer
  • 此外,如果您确实想要使用预编译的AspectJ方面,还需要将AspectJ运行时 aspectjrt.jar 添加到类路径中。

以下是如何在您的案例中运行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 编译文件的路径。