Referencia de Allure SpecFlow
Estos son los atributos y métodos que puedes usar para integrar tus pruebas de SpecFlow con Allure Report.
En la mayoría de los casos, necesitas indicar a Allure SpecFlow que una propiedad determinada debe asignarse al resultado de la prueba. La mayoría de las propiedades pueden asignarse mediante etiquetas Gherkin o a través de la API en tiempo de ejecución.
Etiquetas Gherkin: usa etiquetas Gherkin para asignar varios datos a un
Escenario
o a toda unaCaracterística
. Por defecto, todas las etiquetas Gherkin se convertirán en tags de prueba, pero puedes configurar la conversión a varios otros metadatos mediante expresiones regulares en el archivo de configuración.Ten en cuenta que debido a una limitación en la sintaxis de Gherkin, una etiqueta no puede contener espacios.
Al usar este enfoque, los datos se garantizarán en el resultado de la prueba independientemente de cómo se ejecute la prueba.
API en tiempo de ejecución: usa las funciones de Allure para agregar datos al resultado de la prueba durante la ejecución de sus pasos. Este enfoque permite construir los datos de manera dinámica.
Ten en cuenta que se recomienda llamar a las funciones de Allure lo más cerca posible del inicio de la prueba. De esta forma, los datos se agregarán incluso si la prueba falla temprano.
Metadatos
Asigna la descripción, enlaces y otros metadatos a la prueba.
Título
AllureApi.SetTestName(string name)
Establece el título de la prueba.
using Allure.Net.Commons;
using TechTalk.SpecFlow;
[Binding]
public class Steps
{
[When("I open labels page")]
public void TestLabels()
{
AllureApi.SetTestName("Open labels page");
// ...
}
}
Description
AllureApi.SetDescription(string description)
Establece la descripción de la prueba.
Allure SpecFlow usa la descripción de un escenario del archivo Gherkin, si está presente. Alternativamente, usa la API en tiempo de ejecución para establecer la descripción dinámicamente.
Feature: Labels
Scenario: Create new label for authorized user
This test attempts to create a label with specified title
When I open labels page
And I create label with title "hello"
Then I should see label with title "hello"
using Allure.Net.Commons;
using TechTalk.SpecFlow;
[Binding]
public class Steps
{
[When("I open labels page")]
public void TestLabels()
{
AllureApi.SetDescription("This test attempts to create a label with specified title");
// ...
}
}
Owner
AllureApi.SetOwner(string owner)
Establece el propietario de la prueba.
El formato para las etiquetas Gherkin se configura mediante la opción specflow.labels.owner
.
@allure.label.owner:JohnDoe
Feature: Labels
Scenario: Create new label for authorized user
When I open labels page
And I create label with title "hello"
Then I should see label with title "hello"
using Allure.Net.Commons;
using TechTalk.SpecFlow;
[Binding]
public class Steps
{
[When("I open labels page")]
public void ThenLabels()
{
AllureApi.SetOwner("John Doe");
// ...
}
}
Tag
AllureApi.AddTags(params string[] tags)
Establece los tags de la prueba.
Cualquier etiqueta Gherkin se agrega automáticamente a la lista de etiquetas de la prueba, a menos que coincida con una de las expresiones regulares en la configuración.
@UI @Labels
Feature: Labels
Scenario: Create new label for authorized user
When I open labels page
And I create label with title "hello"
Then I should see label with title "hello"
using Allure.Net.Commons;
using TechTalk.SpecFlow;
[Binding]
public class Steps
{
[When("I open labels page")]
public void TestLabels()
{
AllureApi.AddTags("UI", "Labels");
// ...
}
}
Severity
AllureApi.SetSeverity(SeverityLevel severity)
Establece la severidad de la prueba.
El formato para las etiquetas Gherkin se configura mediante la opción specflow.labels.severity
.
Feature: Labels
@critical
Scenario: Create new label for authorized user
When I open labels page
And I create label with title "hello"
Then I should see label with title "hello"
using Allure.Net.Commons;
using TechTalk.SpecFlow;
[Binding]
public class Steps
{
[When("I open labels page")]
public void TestLabels()
{
AllureApi.SetSeverity(SeverityLevel.critical);
// ...
}
}
Label
AllureApi.AddLabel(string name, string value)
AllureApi.AddLabel(Label label)
AllureApi.AddLabels(params Label[] labels)
Establece una etiqueta arbitraria para la prueba. Esta es la implementación subyacente para muchas de las otras APIs de Allure.
El formato para las etiquetas Gherkin se configura mediante la opción specflow.labels.label
.
@allure.label.layer:web
@allure.label.owner:eroshenkoam
@allure.label.page:/{org}/{repo}/labels
@allure.label.jira:AE-2
Feature: Labels
Scenario: Create new label for authorized user
When I open labels page
And I create label with title "hello"
Then I should see label with title "hello"
using Allure.Net.Commons;
using TechTalk.SpecFlow;
[Binding]
public class Steps
{
[When("I open labels page")]
public void TestLabels()
{
AllureApi.AddLabel("layer", "web");
AllureApi.AddLabel("owner", "eroshenkoam");
AllureApi.AddLabel("page", "/{org}/{repo}/labels");
AllureApi.AddLabel("jira", "AE-2");
// ...
}
}
Allure ID (Allure TestOps)
Establece el ID de la prueba.
El formato para las etiquetas Gherkin se configura mediante la opción specflow.labels.label
. En la etiqueta, usa allure_id
como el nombre de la etiqueta.
Feature: Labels
@allure.label.allure_id:123
Scenario: Create new label for authorized user
When I open labels page
And I create label with title "hello"
Then I should see label with title "hello"
Link
AllureApi.AddLink(string url)
AllureApi.AddLink(string name, string url)
AllureApi.AddLink(string name, string type, string url)
AllureApi.AddLinks(params Link[] links)
AllureApi.AddIssue(string url)
AllureApi.AddIssue(string name, string url)
AllureApi.AddTmsItem(string url)
AllureApi.AddTmsItem(string name, string url)
Agrega un enlace relacionado con la prueba.
Según el type
(que puede ser cualquier cadena; por defecto es “link”), Allure intentará cargar un patrón de enlace correspondiente para procesar la URL, según lo definido en la sección allure.links
del archivo de configuración. Si no se encuentra un patrón para el tipo dado, la URL se deja sin modificar.
El name
se usará como el texto del enlace. Si se omite, se usará la URL no procesada.
Además, puedes usar la sección specflow.links
del archivo de configuración para especificar formatos para agregar enlaces de tipo “link”, “issue” y “tms” mediante etiquetas Gherkin.
@link:https://dev.example.com/
@issue:UI-123
@tms:TMS-456
Feature: Labels
Scenario: Create new label for authorized user
When I open labels page
And I create label with title "hello"
Then I should see label with title "hello"
using Allure.Net.Commons;
using TechTalk.SpecFlow;
[Binding]
public class Steps
{
[When("I open labels page")]
public void TestLabels()
{
AllureApi.AddLink("Website", "https://dev.example.com/");
AllureApi.AddIssue("UI-123");
AllureApi.AddTmsItem("TMS-456");
// ...
}
}
Jerarquía basada en el comportamiento
AllureApi.AddEpic(string epic)
AllureApi.AddFeature(string feature)
AllureApi.AddStory(string story)
Asigna nombres de épicas, características o historias de usuario para una prueba, como parte de la jerarquía basada en comportamientos de Allure.
El formato para las etiquetas Gherkin se configura mediante las opciones specflow.grouping.behaviors
.
@allure.label.epic:WebInterface
Feature: Labels
@allure.label.story:CreateLabels
Scenario: Create new label for authorized user
When I open labels page
And I create label with title "hello"
Then I should see label with title "hello"
using Allure.Net.Commons;
using TechTalk.SpecFlow;
[Binding]
public class Steps
{
[When("I open labels page")]
public void TestLabels()
{
AllureApi.AddEpic("Web interface");
AllureApi.AddFeature("Essential features");
AllureApi.AddStory("Labels");
// ...
}
}
Jerarquía basada en la suite
AllureApi.AddParentSuite(string parentSuite)
AllureApi.AddSuite(string suite)
AllureApi.AddSubSuite(string subSuite)
Asigna los nombres de suite principal, suite o sub-suite para una prueba, como parte de la jerarquía basada en suites de Allure.
El formato para las etiquetas Gherkin se configura mediante las opciones specflow.grouping.suites
.
@allure.label.parentSuite:WebInterface
@allure.label.suite:EssentialFeatures
@allure.label.subSuite:Labels
Feature: Labels
Scenario: Create new label for authorized user
When I open labels page
And I create label with title "hello"
Then I should see label with title "hello"
using Allure.Net.Commons;
using TechTalk.SpecFlow;
[Binding]
public class Steps
{
[When("I open labels page")]
public void TestLabels()
{
AllureApi.AddParentSuite("Web interface");
AllureApi.AddSuite("Essential features");
AllureApi.AddSubSuite("Labels");
// ...
}
}
Jerarquía basada en paquetes
Asigna los nombres de paquete, clase de prueba y método de prueba, como parte de la jerarquía basada en paquetes de Allure.
El formato para las etiquetas Gherkin se configura mediante las opciones specflow.grouping.packages
.
@allure.label.package:org.example
@allure.label.testClass:TestMyWebsite
@allure.label.testMethod:TestLabels()
Feature: Labels
Scenario: Create new label for authorized user
When I open labels page
And I create label with title "hello"
Then I should see label with title "hello"
using Allure.Net.Commons;
using TechTalk.SpecFlow;
[Binding]
public class Steps
{
[When("I open labels page")]
public void TestLabels()
{
AllureApi.AddLabel(Label.Package("org.example"));
AllureApi.AddLabel(Label.TestClass("TestMyWebsite"));
AllureApi.AddLabel(Label.TestMethod("TestLabels()"));
// ...
}
}
Pasos de prueba
AllureApi.Step(string name)
AllureApi.Step(string name, Action acti
T AllureApi.Step<T>(string name, Func<T> function)
async Task AllureApi.Step(string name, Func<Task> action)
async Task<T> AllureApi.Step<T>(string name, Func<Task<T>> function)
Define sub-pasos de prueba con el name
dado.
Hay dos formas de definir un sub-paso.
Sub-pasos lambda
Escribe un sub-paso de prueba en una función lambda y pásalo a
Step()
. Si la función lambda devuelve un valor,Step()
lo devolverá sin modificaciones, y no afectará el informe.Usa
AllureLifecycle.Instance.UpdateStep()
para agregar parámetros personalizados al sub-paso actual, como se muestra en el ejemplo a continuación.Sub-pasos no operativos (no-op)
Si llamas a
Step()
con un nombre pero sin una función lambda, Allure agregará un sub-paso no operativo al informe. Esto permite un informe al estilo de registros dentro de un paso más grande. Un sub-paso no operativo termina inmediatamente después de iniciarse y no puede tener parámetros, archivos adjuntos ni sub-pasos propios.
En el ejemplo a continuación, se crea un nuevo sub-paso lambda en tiempo de ejecución para cada URL de una lista. La URL se agrega a la lista de parámetros del sub-paso. Dentro de cada uno de los sub-pasos, ocurre una secuencia de tres sub-pasos no operativos.
using Allure.Net.Commons;
using TechTalk.SpecFlow;
[Binding]
public class Steps
{
[Then("visit pages")]
public void ThenVisitPages()
{
string[] urls =
{
"https://domain1.example.com/",
"https://domain2.example.com/"
};
foreach (string url in urls)
{
AllureApi.Step($"Test {url}", () =>
{
AllureLifecycle.Instance.UpdateStep(stepResult =>
{
stepResult.parameters.Add(
new Parameter { name = "Webpage URL", value = url }
);
});
AllureApi.Step("Opening web browser...");
// ...
AllureApi.Step($"Visiting {url}...");
// ...
AllureApi.Step("Closing web browser...");
// ...
});
}
}
}
Pruebas parametrizadas
Un informe de prueba de Allure puede reflejar varias formas en las que puedes pasar datos desde tu archivo Gherkin a tu código de implementación en C#, a saber:
- esquemas de escenario,
- tablas de datos verticales,
- tablas de datos horizontales,
- parámetros en tiempo de ejecución.
Esquemas de escenario
En Gherkin, un Escenario con esquema
(o un Plantilla de escenario
) implementa el patrón de pruebas parametrizadas. Un esquema de escenario debe contener una tabla Examples
, de la cual SpecFlow carga conjuntos de parámetros, uno tras otro. Cada conjunto de parámetros se coloca en las declaraciones de los pasos según los marcadores de posición, generando así un nuevo escenario basado en la fila. Luego, SpecFlow ejecuta cada uno de ellos independientemente, como si fuera un Escenario
separado. Los datos pueden ser capturados por una expresión regular y pasados como argumentos separados al código en C#.
Allure SpecFlow reconoce automáticamente este patrón. No se requiere configuración adicional.
El ejemplo a continuación muestra un archivo Gherkin y un archivo de implementación en C# de una prueba. En este ejemplo, los cuatro parámetros para el paso “Introduzco mis detalles...” se mostrarán en ambas instancias del escenario en el informe de la prueba.
Feature: User management
Scenario Outline: Registration
When I go to the registration form
And I enter my details: <login>, <password>, <name>, <birthday>
Then the profile should be created
Examples:
| login | password | name | birthday |
| johndoe | qwerty | John Doe | 1970-01-01 |
| janedoe | 123456 | Jane Doe | 1111-11-11 |
using System;
using TechTalk.SpecFlow;
[Binding]
public class Steps
{
[When("I go to the registration form")]
public void WhenIGoToTheRegistrationForm()
{
// ...
}
[When(@"I enter my details: (.*), (.*), (.*), (.*)")]
public void WhenIEnterMyDetails(
string login, string password, string name, DateTime birthday)
{
// ...
}
[Then("the profile should be created")]
public void ThenTheProfileShouldBeCreated()
{
// ...
}
}
Tablas de datos verticales
Si la declaración de tu paso en Gherkin contiene una tabla de datos con dos columnas, Allure SpecFlow puede mostrar su contenido como parámetros a nivel de paso. Dependiendo de la configuración, este comportamiento se puede aplicar a todas las tablas con dos columnas o solo a aquellas cuyos encabezados coincidan con una expresión regular específica.
La funcionalidad es opcional. Para habilitarla o deshabilitarla, o para modificar las expresiones regulares, edita la sección specflow.stepArguments
del archivo de configuración.
Los datos de la tabla en sí se pasan al código C# sin modificaciones.
El siguiente ejemplo muestra un archivo de configuración, un archivo Gherkin y un archivo de implementación en C# de una prueba. En este ejemplo, los cuatro parámetros para el paso “Introduzco mis detalles” se mostrarán en el informe de la prueba.
{
"specflow": {
"stepArguments": {
"convertToParameters": true,
"paramNameRegex": "^Parameter$",
"paramValueRegex": "^Value$"
}
}
}
Feature: User management
Scenario: Registration
When I go to the registration form
And I enter my details
| Parameter | Value |
| login | johndoe |
| password | qwerty |
| name | John Doe |
| birthday | 1970-01-01 |
Then the profile should be created
using TechTalk.SpecFlow;
[Binding]
public class Steps
{
[When("I go to the registration form")]
public void WhenIGoToTheRegistrationForm()
{
// ...
}
[When("I enter my details")]
public void WhenIEnterMyDetails(Table table)
{
// ...
}
[Then("the profile should be created")]
public void ThenTheProfileShouldBeCreated()
{
// ...
}
}
Tablas de datos horizontales
Si la declaración de tu paso en Gherkin contiene una tabla de datos con una fila, Allure SpecFlow puede mostrar su contenido como parámetros a nivel de paso.
La funcionalidad es opcional. Para habilitarla o deshabilitarla, edita la sección specflow.stepArguments
del archivo de configuración.
Los datos de la tabla en sí se pasan al código C# sin modificaciones.
WARNING
Debido a un detalle de implementación, el procesador de tablas de datos horizontales de Allure SpecFlow solo funciona correctamente si configuras todas las opciones del procesador de tablas de datos verticales. Asegúrate de proporcionar algunas expresiones regulares tanto para paramNameRegex
como para paramValueRegex
, incluso si no planeas usar tablas verticales en tu proyecto.
También ten en cuenta que actualmente, Allure SpecFlow no admite tablas horizontales con solo dos columnas. En su lugar, una tabla de este tipo se interpretará como una tabla de datos vertical.
El siguiente ejemplo muestra un archivo de configuración, un archivo Gherkin y un archivo de implementación en C# de una prueba. En este ejemplo, los cuatro parámetros para el paso “Introduzco mis detalles” se mostrarán en el informe de la prueba.
{
"specflow": {
"stepArguments": {
"convertToParameters": true,
"paramNameRegex": "^Parameter$",
"paramValueRegex": "^Value$"
}
}
}
Feature: User management
Scenario: Registration
When I go to the registration form
And I enter my details
| login | password | name | birthday |
| johndoe | qwerty | John Doe | 1970-01-01 |
Then the profile should be created
using TechTalk.SpecFlow;
[Binding]
public class Steps
{
[When("I go to the registration form")]
public void WhenIGoToTheRegistrationForm()
{
// ...
}
[When("I enter my details")]
public void WhenIEnterMyDetails(Table table)
{
// ...
}
[Then("the profile should be created")]
public void ThenTheProfileShouldBeCreated()
{
// ...
}
}
Parámetros en tiempo de ejecución
AllureApi.AddTestParameter(string name, object? value)
AllureApi.AddTestParameter(string name, object? value, ParameterMode mode)
AllureApi.AddTestParameter(string name, object? value, bool excluded)
AllureApi.AddTestParameter(string name, object? value, ParameterMode mode, bool excluded)
AllureApi.AddTestParameter(Parameter parameter)
La función AddTestParameter()
puede usarse en cualquier momento, incluso si el archivo Gherkin no especifica parámetros reales ni tablas de datos para ningún paso.
Si el argumento excluded
se establece en verdadero, Allure no usará el parámetro al comparar el resultado de la prueba actual con el anterior en el historial. Este argumento solo lo utiliza Allure TestOps.
El argumento mode
afecta cómo se mostrará el parámetro en el informe. Las opciones disponibles están definidas en la enumeración ParameterMode
:
ParameterMode.Default
(igual a no especificar ningún modo) — el parámetro y su valor se mostrarán en una tabla junto con otros parámetros.ParameterMode.Masked
— el parámetro se mostrará en la tabla, pero su valor estará oculto. Usa este modo para contraseñas, tokens y otros parámetros sensibles.ParameterMode.Hidden
— el parámetro y su valor no se mostrarán en el informe de la prueba. Sin embargo, es posible extraer el valor del directorioallure_results
si lo publicas.
El siguiente ejemplo muestra un archivo Gherkin y un archivo de implementación en C# de una prueba. En lo que respecta a SpecFlow, el paso “Introduzco mis detalles” en el ejemplo no tiene ningún dato que se pase a él, sin embargo, Allure mostrará los cuatro parámetros a nivel de prueba.
Feature: User management
Scenario: Registration
When I go to the registration form
And I enter my details
Then the profile should be created
using Allure.Net.Commons;
using TechTalk.SpecFlow;
[Binding]
public class Steps
{
[When("I go to the registration form")]
public void WhenIGoToTheRegistrationForm()
{
// ...
}
[When("I enter my details")]
public void WhenIEnterMyDetails()
{
AllureApi.AddTestParameter("login", "johndoe");
AllureApi.AddTestParameter("password", "qwerty");
AllureApi.AddTestParameter("name", "John Doe");
AllureApi.AddTestParameter("birthday", "1970-01-01");
// ...
}
[Then("the profile should be created")]
public void ThenTheProfileShouldBeCreated()
{
// ...
}
}
Archivos adjuntos
AllureApi.AddAttachment(string name, string type, string path)
AllureApi.AddAttachment(string name, string type, byte[] content, string fileExtension = "")
AllureApi.AddAttachment(string path, string? name = null)
AllureApi.AddScreenDiff(string expectedPng, string actualPng, string diffPng)
Agrega un archivo adjunto al resultado de la prueba bajo el nombre dado.
TIP
Puedes usar datos producidos por cualquier función, no necesariamente leídos desde un archivo real.
Para crear un archivo adjunto usando la API de tiempo de ejecución, llama a AddAttachment()
en cualquier momento durante tu prueba. Pasa ya sea el content
o el path
desde el cual se leerán los datos.
Para asegurarte de que el navegador web del lector mostrará los archivos adjuntos correctamente, se recomienda especificar el tipo de cada archivo adjunto. Para hacerlo, pasa el tipo de medio del contenido como type
y, opcionalmente, una extensión de nombre de archivo como fileExtension
. El tipo de medio afecta cómo se mostrará el dato en el informe de la prueba, mientras que la extensión del archivo se agregará al nombre del archivo cuando el usuario quiera guardar el archivo.
using System.IO;
using System.Text;
using Allure.Net.Commons;
using TechTalk.SpecFlow;
[Binding]
public class Steps
{
[When("I open labels page")]
public void TestLabels()
{
AllureApi.AddAttachment(
"data.txt",
"text/plain",
Encoding.UTF8.GetBytes("This is the file content.")
);
AllureApi.AddAttachment(
"image1.png",
"image/png",
File.ReadAllBytes("/path/to/image1.png")
);
AllureApi.AddAttachment(
"image2.png",
"image/png",
"/path/to/image2.png"
);
}
}
Allure SpecFlow también proporciona una función dedicada AddScreenDiff()
para adjuntar comparaciones visuales.