Обнаружение гонки в настольном тесте - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть табличный тест и init var (worker) вне цикла таблицы. Я запустил тест с go test -raсe и добавил t.Parallel(), и состояние гонки не было обнаружено. Могу ли я предположить, что мой тест свободен от race condition:

//This mock could be in a separate file.
type mockWorker struct {
}
// implment our Worker iterface
func(md mockWorker)Work()error{
    return nil
}
type mockDoer struct{
    Error  error 
    Worker worker
}
// implment our Doer iterface
func(md mockDoer)Do()error{
    if err := md.Worker.Work(); err != nil {
        return err
    }
    return md.Error 
}

func TestBusinessDoer(t *testing.T){
    t.Parallel()
    worker := mockWorker{}
    cases := []struct{
        Name string
        ExpectError bool 
        Error error
    }{
        {
            Name:"test does business logic",
            ExpectError : false,
            Error : nil,
        },
        {
            Name:"test fails when dependency errors",
            ExpectError : true,
            Error : errors.New("an error"),
        },
    }

    for _,td := range cases{
        t.Run(td.Name, func (t *testing.T){
            doer := mockDoer{Error: td.Error, Worker: worker}
            err := mything.BusinessDoer(doer) 
            if td.ExpectError && err == nil{
                t.Fatalf("expected an error but got none")
            } 
            if ! td.ExpectError && err != nil{
                t.Fatalf("did not expect an error but got one %s ", err.Error())
            }
        })
    }
}

1 Ответ

0 голосов
/ 23 апреля 2019

Я думаю, что вам нужно запускать под-тесты параллельно.

Можете ли вы вызвать t.Parallel () внутри подтестов и проверить?

td := td
t.Run(td.Name, func (t *testing.T){
            t.Parallel()
            doer := mockDoer{Error: td.Error, Worker: worker}
            err := mything.BusinessDoer(doer) 
            if td.ExpectError && err == nil{
                t.Fatalf("expected an error but got none")
            } 
            if ! td.ExpectError && err != nil{
                t.Fatalf("did not expect an error but got one %s ", err.Error())
            }
        })

Некоторые ссылки для ссылки наэто параллельно: https://gist.github.com/posener/92a55c4cd441fc5e5e85f27bca008721
https://rakyll.org/parallelize-test-tables/

...