когда отсрочка веселья c выполняется в гинкго - PullRequest
1 голос
/ 03 апреля 2020

Я переписываю юнит-тест нашего контроллера k8s с gink go.

Как и в предыдущем TDD, для каждого теста у нас будет что-то вроде.

    // Create the Channel  object and expect the Reconcile
    g.Expect(c.Create(context.TODO(), myObj)).NotTo(gomega.HaveOccurred())
    defer c.Delete(context.TODO(),myObj)

Мы хотим создать объект для теста и удалить его из кластера подчеркивания после этого теста.

Теперь, на ginkgo, мы запускаем тесты в пределах spec контейнеров. Для меня container - это процесс происхождения, если это так, значит ли это, что defer, определенный в It spe c, будет выполнен перед выходом из container вместо выхода из It spe c .

Например,

var _ = Describe("my desr", func(){
   It("a", func(){
     fmt.Println(100)
     defer func(){fmt.Println("a", 100)}()
   })

   It("b", func(){
     fmt.Println(200)
     defer func(){fmt.Println("b", 200)}()
  })
})

Будет ли результат:

a

100
a100
200
b200

или

b

100
200
b200
a100

В моем случае я определенно определился с первым поведением. Или я в неправильном направлении с точки зрения поведения defer? Я имею в виду, я должен смотреть на BeforeEach и AfterEach подход?

Ответы [ 3 ]

2 голосов
/ 04 апреля 2020

Вы увидите первое поведение, потому что область действия defer s является той же анонимной функцией, что и предыдущая Println. defer красные функции вызываются при выходе из области действия.

2 голосов
/ 04 апреля 2020

«Процесс происхождения» не имеет к этому никакого отношения. Отложенные операторы выполняются, когда окружающая функция возвращает . В вашем случае окружающая функция - это ваша анонимная func(), переданная (и вызванная) It.

1 голос
/ 04 апреля 2020

Планируете ли вы проводить тесты параллельно? Если так, то результаты будут непредсказуемыми. В этом случае рекомендуется иметь отдельный экземпляр внешних ресурсов для каждого процесса.

Я бы порекомендовал посмотреть, как тесты контроллера реализованы во время выполнения контроллера . Я полагаю, они создают новую плоскость управления с envtest каждый раз, когда вызывается BeforeSuit функция . А так как gink go docs сообщает:

при параллельном запуске, каждый параллельный процесс будет выполнять функции BeforeSuite и AfterSuite

...