func (t *T) Fail() {
	if t.tearingDown {
		atomic.StoreInt64(&t.teardownFailed, int64(1))
	} else {
		atomic.StoreInt64(&t.failed, int64(1))
	}
}
Fail marks the function as having failed but continues execution.
package testing
import (
	"runtime"
	"runtime/debug"
	"sync/atomic"
	"time"
	log "github.com/sirupsen/logrus"
	"github.com/form3tech-oss/f1/v2/internal/metrics"
	"github.com/stretchr/testify/require"
)
type T struct {
	Iteration string
	logger         *log.Logger
	failed         int64
	teardownFailed int64
	require        *require.Assertions
	Scenario       string
	teardownStack  []func()
	tearingDown    bool
}
func NewT(iter, scenarioName string) (*T, func()) {
	t := &T{
		Iteration:     iter,
		logger:        log.WithField("i", iter).WithField("scenario", scenarioName).Logger,
		Scenario:      scenarioName,
		teardownStack: []func(){},
	}
	t.require = require.New(t)
	return t, t.teardown
}
func (t *T) Logger() *log.Logger {
	return t.logger
}
func (t *T) Require() *require.Assertions {
	return t.require
}
func (t *T) Name() string {
	return t.Scenario
}
func (t *T) FailNow() {
	if t.tearingDown {
		atomic.StoreInt64(&t.teardownFailed, int64(1))
	} else {
		atomic.StoreInt64(&t.failed, int64(1))
	}
	runtime.Goexit()
}