acto icon indicating copy to clipboard operation
acto copied to clipboard

Collect code coverage after running every test case

Open Spedoske opened this issue 1 year ago • 15 comments

Here is demo of collecting code coverage at runtime. To collect coverage, the following code should add to the operator. We can also make the code as a module and use anonymous import to run the code. The coverage can be collected after every test case.

package main

// See https://go.dev/testing/coverage/
// Build with -cover
// go 1.20+ required

// $ mkdir coverage
// $ go run -cover main.go
// $ curl localhost:8888
// $ curl localhost:8888/dump/coverage
// $ go tool covdata textfmt -o foo -i=coverage
// $ go tool covdata percent -i=coverage
// $ curl localhost:8888 --cookie "bar=baz"
// $ curl localhost:8888/dump/coverage
// $ go tool covdata textfmt -o bar -i=coverage
// $ go tool covdata percent -i=coverage
import (
	"net/http"
	"runtime/coverage"
)

const CoverageDir = "./coverage"

func dumpCoverage(http.ResponseWriter, *http.Request) {
	err := coverage.WriteCountersDir(CoverageDir)
	if err != nil {
		panic(err)
	}
}

func handle(rw http.ResponseWriter, r *http.Request) {
	if len(r.Cookies()) == 0 {
		_, err := rw.Write([]byte("Foo"))
		if err != nil {
			panic(err)
		}
		return
	}
	_, err := rw.Write([]byte("Bar"))
	if err != nil {
		panic(err)
	}
}

func main() {
	err := coverage.WriteMetaDir(CoverageDir)
	if err != nil {
		panic(err)
	}
	http.HandleFunc("/", handle)
	http.HandleFunc("/dump/coverage", dumpCoverage)
	err = http.ListenAndServe(":8888", nil)
	if err != nil {
		panic(err)
	}
}

Coverage-guided testing can be done though this, but it should be hard. As we must wait for the states of the cluster converges. Therefore, the procedure of generating new tests must be very precise, so that we can discover new paths and improve code coverage using these new tests effectively.

Spedoske avatar Jun 03 '23 18:06 Spedoske