Сделать Go тесты независимыми друг от друга (мутация глобальных переменных) - PullRequest
0 голосов
/ 08 апреля 2020

Учитывая, что я запускаю следующие тесты:

const unchanged = "unchanged"

var myField = unchanged

func TestChangeField1(t *testing.T) {
    if myField != unchanged {
        t.FailNow()
    }
    myField = "changed"
}

func TestChangeField2(t *testing.T) {
    if myField != unchanged {
        t.FailNow()
    }
    myField = "changed"
}

Второй тест не пройден, поскольку переменная уже была изменена в другом тесте.

Я знаю, что есть обходные пути, такие как использование набор тестов, который предлагает ловушки для сброса этого значения в исходное состояние между тестами. Но, во-первых, это означает некоторые накладные расходы, а во-вторых, я чувствую, что все поведение удивительно, поэтому я не могу быть уверен, что все в моем проекте это помнят и выполняют.

Есть ли более прямолинейный решение для go test, как флаг, который я еще не нашел?

1 Ответ

2 голосов
/ 08 апреля 2020

@ JimB упомянул об этом в комментариях, но если вам нужно запустить очистку после теста, вы можете зарегистрировать функции, которые запускаются после каждого теста, с помощью t.Cleanup.

package main_test

import (
    "testing"
)

const Default = "default"
const SomethingElse = "something else"

var someVar = Default

func TestOne(t *testing.T) {
    t.Cleanup(resetState)
    if someVar != Default {
        t.FailNow()
    }
    someVar = SomethingElse
}

func TestTwo(t *testing.T) {
    t.Cleanup(resetState)
    if someVar != Default {
        t.FailNow()
    }
    someVar = SomethingElse
}

func resetState() {
    someVar = Default
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...