Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

内联优化导致apply func失效 #157

Open
xiaoHoly opened this issue Jan 10, 2024 · 3 comments
Open

内联优化导致apply func失效 #157

xiaoHoly opened this issue Jan 10, 2024 · 3 comments

Comments

@xiaoHoly
Copy link

需要用户增加go tool env " -gcflags=all=-l"

社区有计划在go monkey包内部解决这个问题吗

@xhd2015
Copy link

xhd2015 commented Mar 19, 2024

xgo从编译器层面解决了这个问题:https://github.com/xhd2015/xgo

@nabice
Copy link

nabice commented Apr 22, 2024

@xhd2015
Is there any article introducing the advantages of xgo over gomonkey?

@xhd2015
Copy link

xhd2015 commented Apr 22, 2024

@xhd2015 Is there any article introducing the advantages of xgo over gomonkey?

@nabice Thanks for replying, there are two articles introducing the xgo:

  1. https://blog.xhd2015.xyz/posts/xgo-monkey-patching-in-go-using-toolexec/
  2. https://blog.xhd2015.xyz/posts/xgo-trace_a-powerful-visualization-tool-in-go/

As a brief comparison, here is a glance:

Overview

xgo gomonkey
Concurrent Safety builtin unsafe
API simpler kind of complex
Compatibility OS and Arch agnostic based on ASM, fails on M1 and M2 often

API Comparison

That's just a brief overview. Here is the API comparasion:
gomonkey

import "github.com/agiledragon/gomonkey/v2"

func greet(s string) string {
     return "hello "+s
}

func TestGreet(t *testing.T){
     // patch is global, need to clear when current test ends
     gp:=gomonkey.NewPatches()
     defer gp.Reset()

     gp.ApplyFunc(greet, func(s string)string{
           return "huh "+s
     })
    result := greet("world")
    if result!="huh world"{
      t.Fatalf("result: %s", result)
   }
}

xgo

import "github.com/xhd2015/xgo/runtime/mock"

func greet(s string) string {
     return "hello "+s
}

func TestGreet(t *testing.T){
     // patch is local, automatically cleared when current test ends
     mock.Patch(greet, func(s string)string{
           return "huh "+s
     })
     result := greet("world")
     if result!="huh world"{
       t.Fatalf("result: %s", result)
    }
}

Trace

Besides the mock API, xgo has a builtin tool that can show the test execution trace:

xgo test --strace ./
xgo tool trace TestGreet.json

Would result a visual stack trace that helps debugging the tests easier, example from Shibbaz/UniverseEventSourcing#11

image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants