родитель
18242bc26a
коммит
a536ddcda8
3 изменённых файлов: 52 добавлений и 10 удалений
16
main.go
16
main.go
|
@ -177,7 +177,7 @@ func Build(pkgName, outpath string, options *compileopts.Options) error {
|
||||||
|
|
||||||
// Test runs the tests in the given package. Returns whether the test passed and
|
// Test runs the tests in the given package. Returns whether the test passed and
|
||||||
// possibly an error if the test failed to run.
|
// possibly an error if the test failed to run.
|
||||||
func Test(pkgName string, options *compileopts.Options, testCompileOnly, testVerbose, testShort bool, outpath string) (bool, error) {
|
func Test(pkgName string, options *compileopts.Options, testCompileOnly, testVerbose, testShort bool, testRunRegexp string, outpath string) (bool, error) {
|
||||||
options.TestConfig.CompileTestBinary = true
|
options.TestConfig.CompileTestBinary = true
|
||||||
config, err := builder.NewConfig(options)
|
config, err := builder.NewConfig(options)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -203,7 +203,7 @@ func Test(pkgName string, options *compileopts.Options, testCompileOnly, testVer
|
||||||
// Run the test.
|
// Run the test.
|
||||||
start := time.Now()
|
start := time.Now()
|
||||||
var err error
|
var err error
|
||||||
passed, err = runPackageTest(config, result, testVerbose, testShort)
|
passed, err = runPackageTest(config, result, testVerbose, testShort, testRunRegexp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -229,7 +229,7 @@ func Test(pkgName string, options *compileopts.Options, testCompileOnly, testVer
|
||||||
// runPackageTest runs a test binary that was previously built. The return
|
// runPackageTest runs a test binary that was previously built. The return
|
||||||
// values are whether the test passed and any errors encountered while trying to
|
// values are whether the test passed and any errors encountered while trying to
|
||||||
// run the binary.
|
// run the binary.
|
||||||
func runPackageTest(config *compileopts.Config, result builder.BuildResult, testVerbose, testShort bool) (bool, error) {
|
func runPackageTest(config *compileopts.Config, result builder.BuildResult, testVerbose, testShort bool, testRunRegexp string) (bool, error) {
|
||||||
var cmd *exec.Cmd
|
var cmd *exec.Cmd
|
||||||
if len(config.Target.Emulator) == 0 {
|
if len(config.Target.Emulator) == 0 {
|
||||||
// Run directly.
|
// Run directly.
|
||||||
|
@ -240,6 +240,9 @@ func runPackageTest(config *compileopts.Config, result builder.BuildResult, test
|
||||||
if testShort {
|
if testShort {
|
||||||
flags = append(flags, "-test.short")
|
flags = append(flags, "-test.short")
|
||||||
}
|
}
|
||||||
|
if testRunRegexp != "" {
|
||||||
|
flags = append(flags, "-test.run="+testRunRegexp)
|
||||||
|
}
|
||||||
cmd = executeCommand(config.Options, result.Binary, flags...)
|
cmd = executeCommand(config.Options, result.Binary, flags...)
|
||||||
cmd.Dir = result.MainDir
|
cmd.Dir = result.MainDir
|
||||||
} else {
|
} else {
|
||||||
|
@ -255,6 +258,9 @@ func runPackageTest(config *compileopts.Config, result builder.BuildResult, test
|
||||||
if testShort {
|
if testShort {
|
||||||
args = append(args, "-test.short")
|
args = append(args, "-test.short")
|
||||||
}
|
}
|
||||||
|
if testRunRegexp != "" {
|
||||||
|
args = append(args, "-test.run="+testRunRegexp)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
cmd = executeCommand(config.Options, config.Target.Emulator[0], args...)
|
cmd = executeCommand(config.Options, config.Target.Emulator[0], args...)
|
||||||
}
|
}
|
||||||
|
@ -1150,10 +1156,12 @@ func main() {
|
||||||
flag.StringVar(&outpath, "o", "", "output filename")
|
flag.StringVar(&outpath, "o", "", "output filename")
|
||||||
}
|
}
|
||||||
var testCompileOnlyFlag, testVerboseFlag, testShortFlag *bool
|
var testCompileOnlyFlag, testVerboseFlag, testShortFlag *bool
|
||||||
|
var testRunRegexp *string
|
||||||
if command == "help" || command == "test" {
|
if command == "help" || command == "test" {
|
||||||
testCompileOnlyFlag = flag.Bool("c", false, "compile the test binary but do not run it")
|
testCompileOnlyFlag = flag.Bool("c", false, "compile the test binary but do not run it")
|
||||||
testVerboseFlag = flag.Bool("v", false, "verbose: print additional output")
|
testVerboseFlag = flag.Bool("v", false, "verbose: print additional output")
|
||||||
testShortFlag = flag.Bool("short", false, "short: run smaller test suite to save time")
|
testShortFlag = flag.Bool("short", false, "short: run smaller test suite to save time")
|
||||||
|
testRunRegexp = flag.String("run", "", "run: regexp of tests to run")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Early command processing, before commands are interpreted by the Go flag
|
// Early command processing, before commands are interpreted by the Go flag
|
||||||
|
@ -1336,7 +1344,7 @@ func main() {
|
||||||
allTestsPassed := true
|
allTestsPassed := true
|
||||||
for _, pkgName := range pkgNames {
|
for _, pkgName := range pkgNames {
|
||||||
// TODO: parallelize building the test binaries
|
// TODO: parallelize building the test binaries
|
||||||
passed, err := Test(pkgName, options, *testCompileOnlyFlag, *testVerboseFlag, *testShortFlag, outpath)
|
passed, err := Test(pkgName, options, *testCompileOnlyFlag, *testVerboseFlag, *testShortFlag, *testRunRegexp, outpath)
|
||||||
handleCompilerError(err)
|
handleCompilerError(err)
|
||||||
if !passed {
|
if !passed {
|
||||||
allTestsPassed = false
|
allTestsPassed = false
|
||||||
|
|
|
@ -18,8 +18,9 @@ import (
|
||||||
|
|
||||||
// Testing flags.
|
// Testing flags.
|
||||||
var (
|
var (
|
||||||
flagVerbose bool
|
flagVerbose bool
|
||||||
flagShort bool
|
flagShort bool
|
||||||
|
flagRunRegexp string
|
||||||
)
|
)
|
||||||
|
|
||||||
var initRan bool
|
var initRan bool
|
||||||
|
@ -33,6 +34,7 @@ func Init() {
|
||||||
|
|
||||||
flag.BoolVar(&flagVerbose, "test.v", false, "verbose: print additional output")
|
flag.BoolVar(&flagVerbose, "test.v", false, "verbose: print additional output")
|
||||||
flag.BoolVar(&flagShort, "test.short", false, "short: run smaller test suite to save time")
|
flag.BoolVar(&flagShort, "test.short", false, "short: run smaller test suite to save time")
|
||||||
|
flag.StringVar(&flagRunRegexp, "test.run", "", "run: regexp of tests to run")
|
||||||
}
|
}
|
||||||
|
|
||||||
// common holds the elements common between T and B and
|
// common holds the elements common between T and B and
|
||||||
|
@ -242,19 +244,42 @@ type InternalTest struct {
|
||||||
type M struct {
|
type M struct {
|
||||||
// tests is a list of the test names to execute
|
// tests is a list of the test names to execute
|
||||||
Tests []InternalTest
|
Tests []InternalTest
|
||||||
|
|
||||||
|
deps testDeps
|
||||||
}
|
}
|
||||||
|
|
||||||
// Run the test suite.
|
// Run the test suite.
|
||||||
func (m *M) Run() int {
|
func (m *M) Run() int {
|
||||||
if len(m.Tests) == 0 {
|
|
||||||
fmt.Fprintln(os.Stderr, "testing: warning: no tests to run")
|
|
||||||
}
|
|
||||||
|
|
||||||
if !flag.Parsed() {
|
if !flag.Parsed() {
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
}
|
}
|
||||||
|
|
||||||
failures := 0
|
failures := 0
|
||||||
|
if flagRunRegexp != "" {
|
||||||
|
var filtered []InternalTest
|
||||||
|
|
||||||
|
// pre-test the regexp; we don't want to bother logging one failure for every test name if the regexp is broken
|
||||||
|
if _, err := m.deps.MatchString(flagRunRegexp, "some-test-name"); err != nil {
|
||||||
|
fmt.Println("testing: invalid regexp for -test.run:", err.Error())
|
||||||
|
failures++
|
||||||
|
}
|
||||||
|
|
||||||
|
// filter the list of tests before we try to run them
|
||||||
|
for _, test := range m.Tests {
|
||||||
|
// ignore the error; we already tested that the regexp compiles fine above
|
||||||
|
if match, _ := m.deps.MatchString(flagRunRegexp, test.Name); match {
|
||||||
|
filtered = append(filtered, test)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m.Tests = filtered
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(m.Tests) == 0 {
|
||||||
|
fmt.Fprintln(os.Stderr, "testing: warning: no tests to run")
|
||||||
|
}
|
||||||
|
|
||||||
for _, test := range m.Tests {
|
for _, test := range m.Tests {
|
||||||
t := &T{
|
t := &T{
|
||||||
common: common{
|
common: common{
|
||||||
|
@ -326,10 +351,15 @@ func TestMain(m *M) {
|
||||||
os.Exit(m.Run())
|
os.Exit(m.Run())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type testDeps interface {
|
||||||
|
MatchString(pat, s string) (bool, error)
|
||||||
|
}
|
||||||
|
|
||||||
func MainStart(deps interface{}, tests []InternalTest, benchmarks []InternalBenchmark, examples []InternalExample) *M {
|
func MainStart(deps interface{}, tests []InternalTest, benchmarks []InternalBenchmark, examples []InternalExample) *M {
|
||||||
Init()
|
Init()
|
||||||
return &M{
|
return &M{
|
||||||
Tests: tests,
|
Tests: tests,
|
||||||
|
deps: deps.(testDeps),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
6
testdata/testing.go
предоставленный
6
testdata/testing.go
предоставленный
|
@ -34,9 +34,13 @@ var benchmarks = []testing.InternalBenchmark{}
|
||||||
var examples = []testing.InternalExample{}
|
var examples = []testing.InternalExample{}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
m := testing.MainStart(nil, tests, benchmarks, examples)
|
m := testing.MainStart(testdeps{}, tests, benchmarks, examples)
|
||||||
exitcode := m.Run()
|
exitcode := m.Run()
|
||||||
if exitcode != 0 {
|
if exitcode != 0 {
|
||||||
println("exitcode:", exitcode)
|
println("exitcode:", exitcode)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type testdeps struct{}
|
||||||
|
|
||||||
|
func (testdeps) MatchString(pat, str string) (bool, error) { return true, nil }
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче