DEV Community

GoyesDev
GoyesDev

Posted on

Swift Testing #3: Organizar, Clasificar y Filtrar pruebas con @Tag

Un proyecto puede tener cientos o miles de pruebas y suites. Cierto subconjunto de estas pruebas puede compartir alguna característica común como ser "crítico" o "inestable". La biblioteca de pruebas de Swift incluye un trait llamado tags para agrugar y categorizar pruebas.

Las etiquetas (Tags) son distintas de las suites de pruebas: Mientras que las suites organizan las pruebas a nivel de código, los tags dan cierta información semántica a una prueba, que puede compartirse con otras entre las distintas suites, archivos o incluso targets de prueba.

Una etiqueta es una instancia de Tag que se declara como una variable estática dentro de Tag con el macro Tag() que obligatoriamente debe existir dentro de una extensión de Tag para que pueda ser usada en las pruebas.

extension Tag {
  @Tag static var legallyRequired: Self
}
Enter fullscreen mode Exit fullscreen mode

Si se usa let en lugar de var en la declaración del Tag se tiene la siguiente advertencia, que falla al usar Swift 6:

Cannot expand accessor macro on variable declared with 'let'; this is an error in the Swift 6 language mode

Puedo usar una o varias etiquetas para marcar una prueba, pasándolas como argumento variádico al "trait" .tags(), después de la descripción de la prueba.

En caso de que use varias etiquetas, esto significa que la prueba haría parte de todos los grupos etiquetados al mismo tiempo. Sin embargo, esto no significa que la prueba se ejecute varias veces, sino que solo ejecuta una vez, pero el resultado aparece en dos grupos.

extension Tag {
  @Tag static var tag1: Self
  @Tag static var tag2: Self
}
@Test("Descripción de la prueba", .tags(.tag1, .tag2))
func prueba() { ... }
Enter fullscreen mode Exit fullscreen mode

Un Tag también puede ser usado para etiquetar una Suite entera de pruebas, lo que implicaría que todas las pruebas de esa Suite tendrían la misma etiqueta.

extension Tag {
  @Tag static var tag1: Self
  @Tag static var tag2: Self
}
@Suite("FEATURE: Alguna funcionalidad", .tags(.tag1, .tag2))
struct FeatureX {
  @Test("Descripción de la prueba 1")
  func prueba1() { ... }
  @Test("Descripción de la prueba 2")
  func prueba2() { ... }
}
Enter fullscreen mode Exit fullscreen mode

Si se declaran dos etiquetas con el mismo nombre en dos lugares, Swift las considera como equivalentes y no presenta problema.
Si se requiere distinguir dos etiquetas con el mismo nombre, se puede declarar un namespace dentro de Tags para diferenciarlas.

extension Tag {
  enum SomeNamespace {}
}

extension Tag.SomeNamespace {
  @Tag static var extraSpecial: Tag
}

@Test(
  "Extra Special Sauce recipe is secret",
  .tags(.SomeNamespace.extraSpecial)
)
func secretSauce() { ... }
Enter fullscreen mode Exit fullscreen mode

En el navegador de pruebas, se pueden agrupar por jerarquía o por etiquetas.

En el reporte de las pruebas aparece una columna adicional con las etiquetas de las pruebas listadas.

Se puede usar las etiquetas para filtrar el resultado. Inicialmente se muestran las pruebas de todas las etiquetas.

Bibliografía

  • Video "Mastering Swift Testing: Organize and Filter Tests with @Tag" (Swift and Tips), aquí.
  • Lista de reproducción "Swift Testing" (Swift and Tips), aquí.
  • Documentación sobre Swift Testing, aquí.
  • Documentación: Adding tags to tests, aquí.

Top comments (0)