myml / myml.github.io

myml的个人网站
https://myml.dev
3 stars 0 forks source link

golang 实时获取测试覆盖率 #26

Open myml opened 5 years ago

myml commented 5 years ago

使用未导出字段

package main

import (
    "context"
    "flag"
    "fmt"
    "log"
    "net/http"
    "reflect"
    "sync"
    "testing"
    "unsafe"
)

func TestRunMain(t *testing.T) {
    main()
}

func TestMain(m *testing.M) {
    flag.Set("test.coverprofile", "c.out")

    mux := http.NewServeMux()
    mux.HandleFunc("/coverprofile", func(resp http.ResponseWriter, req *http.Request) {
        log.Printf("coverage %v", testing.Coverage())
    })
    mux.HandleFunc("/shutdown", func(resp http.ResponseWriter, req *http.Request) {
        err := srv.Shutdown(context.TODO())
        if err != nil {
            fmt.Fprint(resp, err)
            resp.WriteHeader(500)
        }
    })
    go func() {
        for {
            code := m.Run()
            log.Println("code", code)

            v := reflect.ValueOf(m).Elem()
            afterOnce := v.FieldByName("afterOnce")
            afterOnce = reflect.NewAt(afterOnce.Type(), unsafe.Pointer(afterOnce.UnsafeAddr())).Elem()
            afterOnce.Set(reflect.ValueOf(sync.Once{}))
        }
    }()
    http.ListenAndServe(":9222", mux)
}

使用未导出函数

package main

import (
    "context"
    "flag"
    "fmt"
    "log"
    "net/http"
    "testing"
    _ "unsafe"
)

//go:linkname coverReport testing.coverReport
func coverReport()

func TestRunMain(t *testing.T) {
    main()
}

func TestMain(m *testing.M) {
    flag.Set("test.coverprofile", "c.out")

    mux := http.NewServeMux()
    mux.HandleFunc("/coverprofile", func(resp http.ResponseWriter, req *http.Request) {
        log.Printf("coverage %v", testing.Coverage())
    })
    mux.HandleFunc("/coverReport", func(resp http.ResponseWriter, req *http.Request) {
        coverReport()
    })
    mux.HandleFunc("/shutdown", func(resp http.ResponseWriter, req *http.Request) {
        err := srv.Shutdown(context.TODO())
        if err != nil {
            fmt.Fprint(resp, err)
            resp.WriteHeader(500)
        }
    })
    go func() {
        m.Run()
    }()
    http.ListenAndServe(":9222", mux)
}