Ложное срабатывание при отправке SIGTERM в набор тестов Ginkgo

#go #testing #signals #false-positive #ginkgo

# #Вперед #тестирование #сигналы #ложное срабатывание #ginkgo

Вопрос:

При написании тестов с использованием Ginkgo framework я заметил, что нажатие C-c для завершения работы запущенного пакета приводит к ложному срабатыванию.

обратите внимание на зеленое «1 пройдено»

Когда вы посмотрите на код, вы заметите, что этот тест должен завершиться неудачей через 5 секунд. Когда я завершаю его через 2 секунды, набор завершается с ошибкой, но в результатах есть 1 пройденный тест и 0 неудачных.

Аналогичное поведение для версий go 1.11.4 и 1.12.4 в Debian Stretch и Ubuntu 18.04.

Код набора (автоматически генерируемый с помощью ginkgo bootstrap ):

 package hmmm_test

import (
    "testing"

    . "github.com/onsi/ginkgo"
    . "github.com/onsi/gomega"
)

func TestHmmm(t *testing.T) {
    RegisterFailHandler(Fail)
    RunSpecs(t, "Hmmm Suite")
}

 

Тестовый код:

 package hmmm_test

import (
    "time"

    . "github.com/onsi/ginkgo"
    . "github.com/onsi/gomega"
)

var _ = Describe("Hmmm", func() {
    Context("Dummy test", func() {
        It("should fail after 5 seconds", func() {
            time.Sleep(5 * time.Second)
            Expect(1).NotTo(Equal(1))
        })
    })
})
 

Вывод при выполнении теста в течение 5 секунд (правильный):

 $ ginkgo

Running Suite: Hmmm Suite
=========================
Random Seed: 1555580607
Will run 1 of 1 specs
• Failure [5.001 seconds]
Hmmm
/tmp/hmmm/hmmm_test.go:10
  Dummy test
  /tmp/hmmm/hmmm_test.go:11
    should fail after 5 seconds [It]
    /tmp/hmmm/hmmm_test.go:12
    Expected
        <int>: 1
    not to equal
        <int>: 1
    /tmp/hmmm/hmmm_test.go:14
------------------------------
Summarizing 1 Failure:
[Fail] Hmmm Dummy test [It] should fail after 5 seconds
/tmp/hmmm/hmmm_test.go:14
Ran 1 of 1 Specs in 5.002 seconds
FAIL! -- 0 Passed | 1 Failed | 0 Pending | 0 Skipped
--- FAIL: TestHmmm (5.00s)
FAIL
Ginkgo ran 1 suite in 5.665592703s
Test Suite Failed
 

Вывод при завершении теста до его завершения (ложноположительный результат):

 $ ginkgo

Running Suite: Hmmm Suite
=========================
Random Seed: 1555580763
Will run 1 of 1 specs
^C
Ran 1 of 1 Specs in 1.187 seconds
FAIL! -- 1 Passed | 0 Failed | 0 Pending | 0 Skipped
Ginkgo ran 1 suite in 1.85541211s
Test Suite Failed
 

Я ожидаю, что результат будет примерно таким:
FAIL! -- 0 Passed | 1 Failed | 0 Pending | 0 Skipped
Или 1 пропущен или находится в ожидании, но не Passed особенно, что тест записан на сбой.

Фактический вывод указывает на сбой, но также и на то, что все тесты … пройдены: FAIL! -- 1 Passed | 0 Failed | 0 Pending | 0 Skipped

Я что-то упустил?

Комментарии:

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

2. Как я уже сказал, строго не ожидайте сбоя — об этом можно сообщить как Pending или даже Skipped , но я, конечно, не ожидал Passed бы результата. В любом случае, я свяжу это с Ginkgo issue tracker и посмотрю, что они скажут.

Ответ №1:

Это ожидаемое поведение, но я бы не стал утверждать, что оно было преднамеренным, понятным или правильным. Это происходит потому, что тесты начинают свой жизненный цикл с passing 1 и изменяют состояния при других событиях (сбой / паника).

Когда Ginkgo получит a SIGTERM , он не остановит текущий тест (хотя это предотвратит запуск дополнительных тестов 2). Параллельно он будет собирать отчет для тестов, которые были выполнены до сих пор 3. Эта коллекция будет повторяться по всем узлам, которые начали «обработку»4 (слабо коррелирует с, но запускается немного раньше, чем выполняется). Поскольку тест начался в состоянии пройдено и оно не изменилось, сообщается, что он пройден.

Этот вопрос не подходит для обсуждения обоснованности этого подхода (и вполне может быть лучший). Пожалуйста, используйте проблему, которую вы открыли, если хотите запросить изменение этого поведения 5.