DEV Community

David Goyes
David Goyes

Posted on

Swift Testing #2: Agrupando pruebas con @Suite

Una "Suite" es un grupo de pruebas.

Al crear una estructura que contiene pruebas marcadas con @Test, esta viene marcada automática con una "S" dentro del reporte de pruebas, indicando que es una "Suite". Esto significa que una estructura que agrupa pruebas es una "Suite" implícitamente.

Se puede crear una "Suite" de forma explícita con la etiqueta @Suite, y en el reporte de pruebas aparecerá con el nombre que use para describirla.

@Suite("GIVEN some common preconditions")
struct CommonpreconditionsTests {
  @Test
  func specificAction() throws {
  }
}
Enter fullscreen mode Exit fullscreen mode

Se pueden anidar "Suite"s para describir mejor las pruebas con funcionalidades, escenarios y precondiciones comunes.

Aquí conviene usar la notación Gherkin de BDD que describe varios niveles y pasos para definir una prueba automatizada:

  1. Feature: Descripción a alto nivel de la funcionalidad que se va a probar. Siempre encabeza el archivo, así que sería el primer nivel de Suite en nuestras pruebas de Swift Testing.
  2. Scenario: Un caso de uso específico de la funcionalidad que se va a probar. Sería el segundo nivel de Suite dentro del "Feature".
  3. Given: Describe el estado inicial o las precondiciones del sistema antes del escenario.
  4. When: Describe la acción o evento que dispara el escenario.
  5. Then: Describe el resultado esperado o post-condiciones del sistema después del escenario.
  6. And: Un paso sucesivo.
@Suite("FEATURE: Calculator")
struct CalculatorTests {
  @Suite("SCENARIO: Add two numbers")
  struct AddingTwoNumbers {
    @Test("GIVEN: I have entered 50 in the calculator AND: I have entered 70 in the calculator WHEN: I press add THEN: the result should be 120 on the screen")
    func regularCase() {
      let x = 50
      let y = 70
      let result = x + y
      let expected = 120
      #expect(result == expected)
    }
    @Test("GIVEN: I have entered <First> in the calculator AND: I have entered <Second> into the calculator WHEN: I press add THEN: the result should be <Result> on the Screen")
    func generalization() {
      let x = 60
      let y = 70
      let result = x + y
      let expected = 130
      #expect(result == expected)
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

En el reporte de pruebas luciría así:

- FEATURE: Calculator
- - SCENARIO: Add two numbers
- - - GIVEN: I have entered 50 in the calculator AND: I have entered 70 in the calculator WHEN: I press add THEN: the result should be 120 on the screen
- - - GIVEN: I have entered <First> in the calculator AND: I have entered <Second> into the calculator WHEN: I press add THEN: the result should be <Result> on the Screen
Enter fullscreen mode Exit fullscreen mode

Si algunas pruebas comparten precondiciones (i.e. "GIVEN") también podría pensar en agruparlas con otra Suite. Por ejemplo:

@Suite("FEATURE: Calculator")
struct CalculatorTests {
  @Suite("SCENARIO: Substracting two numbers")
  struct SubtractingTwoNumbers {
    @Suite("GIVEN common pre-conditions")
    struct CommonPreconditions {
      @Test("WHEN: I press substract one THEN: the result should be...")
      func case1() {
        // ...
        #expect(result == expected)
      }
      @Test("WHEN: I press subtract twice THEN: the result should be...")
      func case2() {
        // ...
        #expect(result == expected)
      }
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Luego, el reporte se vería así:

- FEATURE: Calculator
- - SCENARIO: Substracting two numbers
- - - GIVEN: come pre-conditions
- - - - WHEN: I press substract one THEN: the result should be...
- - - - WHEN: I press subtract twice THEN: the result should be...
Enter fullscreen mode Exit fullscreen mode

También podría agrupar pruebas por la acción a realizar (i.e. WHEN). Al final del día, la definición de Suites depende del caso específico a construir en cada momento.

Observaciones

XCTAssert requiere vivir dentro de un XCTestCase para funcionar. No es que se pueda hacer una migración a Swift Testing solo moviendo el código que usa XCTAssert.
Se puede agrupar pruebas con @Suite y se las puede anidar para mejorar el orden del reporte de pruebas. En lo posible usar Gherkin (Feature/Scenario) para describir mejor las pruebas.

Bibliografia

  • Video "Mastering Swift Testing: Creating Subgroups of Tests with @suite" (Swift Testing), aquí.
  • Lista de reproducción "Swift Testing" (Swift and Tips), aquí.
  • Documentación sobre Swift Testing, aquí.

Top comments (0)