ozontech / allure-go

Complete Allure provider in Go which doesn't overload the interface usage
https://t.me/allure_go_chat
Apache License 2.0
306 stars 33 forks source link

Странная работа метода t.WithNewStep, t.Step #4

Closed anton-ryabkov closed 2 years ago

anton-ryabkov commented 2 years ago

Добрый день

Сегодня попробовал использовать ваш проект для написания unit тестов, в результате проб возник следующий вопрос: если я в тесте делаю Step (через WithNewStep) и в переданной функции тест фейлится (require не проходит), то в allure отчете все равно данный шаг помечается как успешный. Пример кода, и отчета прилагаю:


type SomeSuite struct {
    suite.Suite
}

func (s *SomeSuite) TestSome(t provider.T) {
    t.WithNewStep("Step 1", func(sCtx provider.StepCtx) {
        require.Equal(t, 2, 2)
    })
    t.WithNewStep("Шаг 2", func(sCtx provider.StepCtx) {
        require.Equal(t, 2, 3)
    })
    t.WithNewStep("Шаг 3", func(sCtx provider.StepCtx) {
        require.Equal(t, 2, 2)
    })

}

func TestSkipDemo(t *testing.T) {
    suite.RunSuite(t, new(SomeSuite))
}

Аналогично если делать t.Step.

133a9d3f-db0d-11ec-9001-bce92f7d8cfc-result.zip

Подскажите, это ожидаемое поведение, или же нет?

koodeex commented 2 years ago

это ожидаемое, да
в интерфейсе StepCtx есть методы Require() и Assert() для отображения состояния шагов рекомендуется использование ассертов оттуда (эти ассерты так же будут отображены в отчете)

type SomeSuite struct {
    suite.Suite
}

func (s *SomeSuite) TestSome(t provider.T) {
    t.WithNewStep("Step 1", func(sCtx provider.StepCtx) {
        sCtx.Require().Equal(2, 2)
    })
    t.WithNewStep("Шаг 2", func(sCtx provider.StepCtx) {
        sCtx.Require().Equal(2, 3)
    })
    t.WithNewStep("Шаг 3", func(sCtx provider.StepCtx) {
        sCtx.Require().Equal(2, 2)
    })

}

func TestSkipDemo(t *testing.T) {
    suite.RunSuite(t, new(SomeSuite))
}

Альтернативно, Вы можете попробовать прокидывать вместо t в ассерты интерфейс provider.StepCtx

type SomeSuite struct {
    suite.Suite
}

func (s *SomeSuite) TestSome(t provider.T) {
    t.WithNewStep("Step 1", func(sCtx provider.StepCtx) {
        require.Equal(sCtx, 2, 2)
    })
    t.WithNewStep("Шаг 2", func(sCtx provider.StepCtx) {
        require.Equal(sCtx, 2, 2)
    })
    t.WithNewStep("Шаг 3", func(sCtx provider.StepCtx) {
        require.Equal(sCtx, 2, 2)
    })

}

func TestSkipDemo(t *testing.T) {
    suite.RunSuite(t, new(SomeSuite))
}

Это работает так, потому что в testify используется интерфейс TestingT, который реализует как provider.StepCtx, так и provider.T

koodeex commented 2 years ago

@anton-ryabkov . подскажите, смог ли я ответить на Ваш вопрос?

anton-ryabkov commented 2 years ago

Антон, добрый день. Да, спасибо. Это то что надо. Перевел тест на использование require.Equal(sCtx, 2, 3) и теперь отчет формируется правильно :+1: