время. После того, как не сработало после указанного времени - PullRequest
0 голосов
/ 15 сентября 2018

Я использую go1.10 darwin / amd64 и пытаюсь установить пользовательское время ожидания для моего тестирования во время выполнения, используя следующий фрагмент кода.

И я выполняю тест с помощью команды, установив тайм-аут Go на 11 м и установив таймер паники теста на 5 м, и заметил, что значение тайм-аута Go срабатывает, а не мое.

go test github.com/foo -run TestMod -v --race -timeout 11m
...
...
*** Test killed with quit: ran too long (12m0s).

Фрагмент кода:

// Returns time.Duration from given string
// Default return value: "2h0m0s"
func GetDuration(timeoutStr string) time.Duration {
    // Default timeout to 2 hours
    durationToReturn := (2 * time.Hour)

    pattern, _ := regexp.Compile("^([0-9]+)([mhd])$")

    // Calculates only if valid pattern exists
    if pattern.MatchString(timeoutStr) {
        match := pattern.FindStringSubmatch(timeoutStr)
        timeoutVal, err := strconv.Atoi(match[1])
        if err != nil {
            return durationToReturn
        }
        timeoutDuration := time.Duration(timeoutVal)
        switch match[2] {
        case "m":
            durationToReturn = timeoutDuration * time.Minute
        case "h":
            durationToReturn = timeoutDuration * time.Hour
        case "d":
            durationToReturn = timeoutDuration * (time.Hour * 24)
        }
    }
    return durationToReturn
}

// Starts timeout trigger based on given value in suiteData.Timeout
func StartTimeoutTimer() {
    timeoutStr := "5m"
    go func() {
        timeoutDuration := GetDuration(timeoutStr)
        fmt.Printf("Setting timeout of %v from %v\n", timeoutDuration, time.Now())
        <-time.After(timeoutDuration)
        fmt.Printf("Timeout happened at %v\n", time.Now())
        panic("Test timed out..")
    }()
}

func TestMain(m *testing.M) {
    StartTimeoutTimer()
    for {
    }
}

1 Ответ

0 голосов
/ 15 сентября 2018

Нет гарантии, что новая процедура в StartTimeoutTimer() будет выполнена.StartTimeoutTimer() Возврат сразу после создания новой программы.

Я думаю, что вы хотите что-то вроде

done := make(chan struct{})
go func(){
    testFunc()
    close(done)
}()
select {
    case <- time.After(duration):
        panic("...")
    case <- done:
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...