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

test: would like to replace gomonkey with xgo #3421

Open
xhd2015 opened this issue Apr 17, 2024 · 2 comments
Open

test: would like to replace gomonkey with xgo #3421

xhd2015 opened this issue Apr 17, 2024 · 2 comments
Labels
kind/feature Categorizes issue or PR as related to a new feature.

Comments

@xhd2015
Copy link

xhd2015 commented Apr 17, 2024

Current tests use gomonkey to setup and clear patches, which is not concurrent safe and does not always run well.

Here comes the new options: https://github.com/xhd2015/xgo.

If you like, I will later issue a PR to replace gomonkey, as did in this PR: kilianc/base-golang#3

@xhd2015 xhd2015 added the kind/feature Categorizes issue or PR as related to a new feature. label Apr 17, 2024
@Monokaix
Copy link
Member

Could you describe more detail about the two repoes and why xgo is better?

@xhd2015
Copy link
Author

xhd2015 commented Apr 19, 2024

Could you describe more detail about the two repoes and why xgo is better?

Overview

Hi @Monokaix thanks for replying. Xgo and gomonkey can be compared as the following:

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/GOEventBus#11

image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
kind/feature Categorizes issue or PR as related to a new feature.
Projects
None yet
Development

No branches or pull requests

2 participants