TestMain - тесты не запускаются - PullRequest
0 голосов
/ 10 февраля 2019

Я пишу пакет, который компилирует исходный файл C и записывает вывод в другой файл.Я пишу тесты для этого пакета, и мне нужно создать временный каталог для записи выходных файлов.Я использую TestMain функцию, чтобы сделать это.По какой-то причине я всегда получаю предупреждение «тесты не запускаются», когда я просто запускаю тест TestMain.Я попытался отладить функцию TestMain и вижу, что временный каталог действительно создан.Когда я создаю каталог testoutput вручную, все тесты проходят.

Я загружаю два исходных файла C из каталога testdata, один из которых преднамеренно неправильный.

gcc.go:

package gcc

import (
    "os/exec"
)

func Compile(inPath, outPath string) error {
    cmd := exec.Command("gcc", inPath, "-o", outPath)
    return cmd.Run()
}

gcc_test.go:

package gcc

import (
    "os"
    "path/filepath"
    "testing"
)

func TestOuputFileCreated(t *testing.T) {
    var inFile = filepath.Join("testdata", "correct.c")
    var outFile = filepath.Join("testoutput", "correct_out")

    if err := Compile(inFile, outFile); err != nil {
        t.Errorf("Expected err to be nil, got %s", err.Error())
    }

    if _, err := os.Stat(outFile); os.IsNotExist(err) {
        t.Error("Expected output file to be created")
    }
}

func TestOuputFileNotCreatedForIncorrectSource(t *testing.T) {
    var inFile = filepath.Join("testdata", "wrong.c")
    var outFile = filepath.Join("testoutput", "wrong_out")

    if err := Compile(inFile, outFile); err == nil {
        t.Errorf("Expected err to be nil, got %v", err)
    }

    if _, err := os.Stat(outFile); os.IsExist(err) {
        t.Error("Expected output file to not be created")
    }
}

func TestMain(m *testing.M) {
    os.Mkdir("testoutput", 666)
    code := m.Run()
    os.RemoveAll("testoutput")
    os.Exit(code)
}

go test выход:

sriram@sriram-Vostro-15:~/go/src/github.com/sriram-kailasam/relab/pkg/gcc$ go test
--- FAIL: TestOuputFileCreated (0.22s)
        gcc_test.go:14: Expected err to be nil, got exit status 1
FAIL
FAIL    github.com/sriram-kailasam/relab/pkg/gcc        0.257s

Работает TestMain:

Running tool: /usr/bin/go test -timeout 30s github.com/sriram-kailasam/relab/pkg/gcc -run ^(TestMain)$

ok      github.com/sriram-kailasam/relab/pkg/gcc    0.001s [no tests to run]
Success: Tests passed.

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

# 1

Попытка запустить TestMain() - это все равно, что попытаться запустить main().Вы этого не делаете, ОС делает это за вас.

TestMain был введен в Go 1.4 для помощи в настройке / разборке тестовой среды и вызывается вместо запуска тестов;цитируя примечания к выпуску:

Если код теста содержит функцию

func TestMain(m *testing.M) 

, то эта функция будет вызываться вместо непосредственного запуска тестов.Структура M содержит методы для доступа и запуска тестов.


# 2

Используйте ioutil.TempDir() для создания временных каталогов.

tmpDir, err := ioutil.TempDir("", "test_output")
if err != nil {
    // handle err
}

Он позаботится о создании каталога.Позже вам следует использовать os.Remove(tmpDir) для удаления временного каталога.

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

func TestCompile(t *testing.T) {
    tmpDir, err := ioutil.TempDir("", "testdata")
    if err != nil {
        t.Error(err)
    }
    defer os.Remove(tmpDir)

    tests := []struct {
        name, inFile, outFile string
        err                   error
    }{
        {"OutputFileCreated", "correct.c", "correct_out", nil},
        {"OutputFileNotCreatedForIncorrectSource", "wrong.c", "wrong_out", someErr},
    }

    for _, test := range tests {
        var (
            in  = filepath.Join("testdata", test.inFile)
            out = filepath.Join(tmpDir, test.outFile)
        )

        t.Run(test.name, func(t *testing.T) {
            err = Compile(in, out)
            if err != test.err {
                t.Errorf("Compile(%q, %q) == %v; Wanted %v", in, out, err, test.err)
            }
        })
    }
}
0 голосов
/ 10 февраля 2019

Скорее всего, ваши проблемы примерно равны значению mode , которое вы передаете os.Mkdir(...).Вы предоставляете 666 десятичное число, которое является 01232 восьмеричным (или, если хотите, разрешение строка d-w--wx-wT), которое, как я полагаю, не совсем то, что вы ищете.

Вместо 666 вы должны указать 0666 - ведущий 0 указывает, что ваше значение находится в восьмеричной записи.


Кроме того, два ваших теста практически идентичны;вместо того, чтобы использовать TestMain(...) для выполнения вашей настройки, я бы предложил использовать *T.Run(...) для выполнения ваших тестов из единственной функции Test* верхнего уровня.Примерно так:

gcc_test.go:

package gcc

import (
  "testing"
  "path/filepath"
  "os"
)

const testoutput = "testoutput"

type testcase struct {
  inFile  string
  outFile string
  err     error
}

func (tc *testcase) test(t *testing.T) {
  var (
    in  = filepath.Join("testdata", tc.inFile)
    out = filepath.Join(testoutput, tc.outFile)
  )

  if err := Compile(in, out); err != tc.err {
    t.Errorf("Compile(%q, %q) == %v; Wanted %v", in, out, err, tc.err)
  }
}

func TestCompile(t *testing.T) {
  os.Mkdir(testoutput, 0666)

  tests := map[string]*testcase{
    "correct": &testcase{"correct.c", "correct_out", nil},
    "wrong":   &testcase{"wrong.c", "wrong_out", expectedError},
  }

  for name, tc := range tests {
    t.Run(name, tc.test)
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...