Black Lives Matter. Support the Equal Justice Initiative.

Source file src/testing/helper_test.go

Documentation: testing

     1  // Copyright 2017 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package testing
     6  
     7  import (
     8  	"bytes"
     9  	"regexp"
    10  	"strings"
    11  )
    12  
    13  func TestTBHelper(t *T) {
    14  	var buf bytes.Buffer
    15  	ctx := newTestContext(1, newMatcher(regexp.MatchString, "", ""))
    16  	t1 := &T{
    17  		common: common{
    18  			signal: make(chan bool),
    19  			w:      &buf,
    20  		},
    21  		context: ctx,
    22  	}
    23  	t1.Run("Test", testHelper)
    24  
    25  	want := `--- FAIL: Test (?s)
    26  helperfuncs_test.go:12: 0
    27  helperfuncs_test.go:33: 1
    28  helperfuncs_test.go:21: 2
    29  helperfuncs_test.go:35: 3
    30  helperfuncs_test.go:42: 4
    31  --- FAIL: Test/sub (?s)
    32  helperfuncs_test.go:45: 5
    33  helperfuncs_test.go:21: 6
    34  helperfuncs_test.go:44: 7
    35  helperfuncs_test.go:56: 8
    36  helperfuncs_test.go:64: 9
    37  helperfuncs_test.go:60: 10
    38  `
    39  	lines := strings.Split(buf.String(), "\n")
    40  	durationRE := regexp.MustCompile(`\(.*\)$`)
    41  	for i, line := range lines {
    42  		line = strings.TrimSpace(line)
    43  		line = durationRE.ReplaceAllString(line, "(?s)")
    44  		lines[i] = line
    45  	}
    46  	got := strings.Join(lines, "\n")
    47  	if got != want {
    48  		t.Errorf("got output:\n\n%s\nwant:\n\n%s", got, want)
    49  	}
    50  }
    51  
    52  func TestTBHelperParallel(t *T) {
    53  	var buf bytes.Buffer
    54  	ctx := newTestContext(1, newMatcher(regexp.MatchString, "", ""))
    55  	t1 := &T{
    56  		common: common{
    57  			signal: make(chan bool),
    58  			w:      &buf,
    59  		},
    60  		context: ctx,
    61  	}
    62  	t1.Run("Test", parallelTestHelper)
    63  
    64  	lines := strings.Split(strings.TrimSpace(buf.String()), "\n")
    65  	if len(lines) != 6 {
    66  		t.Fatalf("parallelTestHelper gave %d lines of output; want 6", len(lines))
    67  	}
    68  	want := "helperfuncs_test.go:21: parallel"
    69  	if got := strings.TrimSpace(lines[1]); got != want {
    70  		t.Errorf("got output line %q; want %q", got, want)
    71  	}
    72  }
    73  
    74  func TestTBHelperLineNumer(t *T) {
    75  	var buf bytes.Buffer
    76  	ctx := newTestContext(1, newMatcher(regexp.MatchString, "", ""))
    77  	t1 := &T{
    78  		common: common{
    79  			signal: make(chan bool),
    80  			w:      &buf,
    81  		},
    82  		context: ctx,
    83  	}
    84  	t1.Run("Test", func(t *T) {
    85  		helperA := func(t *T) {
    86  			t.Helper()
    87  			t.Run("subtest", func(t *T) {
    88  				t.Helper()
    89  				t.Fatal("fatal error message")
    90  			})
    91  		}
    92  		helperA(t)
    93  	})
    94  
    95  	want := "helper_test.go:92: fatal error message"
    96  	got := ""
    97  	lines := strings.Split(strings.TrimSpace(buf.String()), "\n")
    98  	if len(lines) > 0 {
    99  		got = strings.TrimSpace(lines[len(lines)-1])
   100  	}
   101  	if got != want {
   102  		t.Errorf("got output:\n\n%v\nwant:\n\n%v", got, want)
   103  	}
   104  }
   105  
   106  type noopWriter int
   107  
   108  func (nw *noopWriter) Write(b []byte) (int, error) { return len(b), nil }
   109  
   110  func BenchmarkTBHelper(b *B) {
   111  	w := noopWriter(0)
   112  	ctx := newTestContext(1, newMatcher(regexp.MatchString, "", ""))
   113  	t1 := &T{
   114  		common: common{
   115  			signal: make(chan bool),
   116  			w:      &w,
   117  		},
   118  		context: ctx,
   119  	}
   120  	f1 := func() {
   121  		t1.Helper()
   122  	}
   123  	f2 := func() {
   124  		t1.Helper()
   125  	}
   126  	b.ResetTimer()
   127  	b.ReportAllocs()
   128  	for i := 0; i < b.N; i++ {
   129  		if i&1 == 0 {
   130  			f1()
   131  		} else {
   132  			f2()
   133  		}
   134  	}
   135  }
   136  

View as plain text