Что значит *testing. T в go?

Я делаю унитарные доказательства в Go и согласно каким-то примерам, функция доказательства определяется так:

func TestAlgo(t *testing.T) {
    ...
}

То, что я хочу узнать: что значит точно параметр этой функции?

Также я увидел, что они делают что-то как:

func TestAlgo(*testing.B) {
    ...
}

Каково различие с предыдущим параметром?

4
задан 08.03.2016, 19:00
1 ответ

Поскольку он упомянул об этом, все методы, которые хотят выполнить как доказательства, должны высказываться, таким образом:

func TestAlgo(t *testing.T) {
    ...
}

Почему? просто это контракт между Вами, программистом, и языком, таким образом что, выполнив команду go test Go выполнил унитарные доказательства унитарной формы. Чтобы допускать, какие, эти должны быть осуществленными в методах формы

func TestXxx(*testing.T)

где каждый метод начал со словом Тест, и Xxx - любая буквенно-цифровая цепь, которая начиналась бы в прописной букве. Добавочный в это, метод должен получать как аргумент переменную типа *testing.T. Однако: что значит этот параметр? В esté метод Вы переходите с ним суфлер в так называемую структуру T что находится внутри пакета testing. Этот параметр проходит во все методы, которые выполняют унитарные доказательства, так как структура хранит информацию о состоянии доказательств и формата, в котором он должен печатать logs, если он так это желает в течение выполнения доказательства. Здесь смоги видеть исходный код, в котором она признает себя этой структурой.

Различие между

func TestAlgo(t *testing.T) {
    ... 
}

и

func TestAlgo(*testing.B) {
    ...
}

дело в том, что в действительности второй метод не будет работать как унитарное автоматическое доказательство, потому что он не выполняет контракт, которого требует Go, потому что получает суфлер в структуру типа B внутри пакета testing. Эта структура B он ссылается на тип информации, которая используется, чтобы выполнять доказательства benchmark, или результата, который он хотел бы включить. Однако, правильное заявление методов, которые хотят работать так:

func BenchmarkXxx(*testing.B) {
    ...
}

Сейчас, если он в действительности ссылается на различие между

func TestAlgo(t *testing.T) {
    ... 
}

и

func TestAlgo(*testing.T) {
    ...
}

(оба с параметром суфлер в структуру типа T в пакете testing) дело в том, что в действительности нет никакого различия. В Go, имя переменной в аргументах функций не является строго необходимым, только тип. Однако, если он хочет реализовать что-то как:

func TestAlgo(*testing.T) {
    //Método de ejecución de la prueba
    //Si ocurre un error, imprima un mensaje ó marque la prueba como fallida.
}

он будет нуждаться в том, чтобы использовать имя переменной, чтобы призывать в доступные методы в T печатать ошибки, следовательно, да будет должен объявлять имя переменной также, что ссылка обычно обозначает ее t:

func TestAlgo(t *testing.T) {
    a = 1
    if a != 2 {
        t.Error("1 no es igual a 2)
    }
}

В документации Go есть больше информации по этому поводу.

5
ответ дан 24.11.2019, 14:45

Теги

Похожие вопросы