Referencia de Allure xUnit.net
Estos son los atributos y métodos que puedes usar para integrar tus pruebas de xUnit.net con Allure Report.
En la mayoría de los casos, Allure xUnit.net ofrece dos formas diferentes de usar una característica: la API de Atributos y la API en Tiempo de Ejecución.
API de Atributos: agrega un atributo C# a un método de prueba o a una clase completa para agregar ciertos datos al resultado de la prueba. Al usar este enfoque, se garantiza que los datos se agregarán independientemente de cómo se ejecute la prueba.
API en Tiempo de Ejecución: usa las funciones de Allure para agregar ciertos datos al resultado de la prueba durante su ejecución. Este enfoque permite construir los datos dinámicamente.
Ten en cuenta que se recomienda llamar a las funciones de Allure lo más cerca posible al inicio de la prueba. De esta manera, los datos se agregarán incluso si la prueba falla temprano.
Metadatos
Asigna la descripción, enlaces y otros metadatos de la prueba.
Title
[AllureName(string name)]
AllureApi.SetTestName(string name)
Establece el título de la prueba.
A diferencia de la mayoría de las funciones descritas aquí, el argumento DisplayName
es parte de xUnit.net mismo.
Si necesitas construir el título de la prueba dinámicamente, escribe una función lambda que lo haga y pásala al método updateTestCase()
del objeto AllureLifecycle
, consulta el ejemplo a continuación.
using Xunit;
public class TestLabels
{
[Fact(DisplayName = "Create labels")]
public void TestCreateLabel()
{
// ...
}
}
using Allure.Net.Commons;
using Xunit;
public class TestLabels
{
[Fact]
public void TestCreateLabel()
{
AllureApi.SetTestName("Create labels");
// ...
}
}
Description
[AllureDescription(string description)]
AllureApi.SetDescription(string description)
Establece la descripción de la prueba. Se permite el formato Markdown. Cualquier formato HTML, si está presente, será eliminado por razones de seguridad.
using Allure.Xunit.Attributes;
using Xunit;
public class TestLabels
{
[Fact]
[AllureDescription("This test attempts to create a label with specified title")]
public void TestCreateLabel()
{
// ...
}
}
using Allure.Net.Commons;
using Xunit;
public class TestLabels
{
[Fact]
public void TestCreateLabel()
{
AllureApi.SetDescription("This test attempts to create a label with specified title");
// ...
}
}
Owner
[AllureOwner(string value)]
AllureApi.SetOwner(string owner)
Establece el propietario de la prueba.
using Allure.Xunit.Attributes;
using Xunit;
public class TestLabels
{
[Fact]
[AllureOwner("John Doe")]
public void TestCreateLabel()
{
// ...
}
}
using Allure.Net.Commons;
using Xunit;
public class TestLabels
{
[Fact]
public void TestCreateLabel()
{
AllureApi.SetOwner("John Doe");
// ...
}
}
Tag
[AllureTag(params string[] tags)]
AllureApi.AddTags(params string[] tags)
Establece los tags de la prueba.
using Allure.Xunit.Attributes;
using Xunit;
public class TestLabels
{
[Fact]
[AllureTag("UI", "Labels")]
public void TestCreateLabel()
{
// ...
}
}
using Allure.Net.Commons;
using Xunit;
public class TestLabels
{
[Fact]
public void TestCreateLabel()
{
AllureApi.AddTags("UI", "Labels");
// ...
}
}
Severity
[AllureSeverity(SeverityLevel value)]
AllureApi.SetSeverity(SeverityLevel severity)
Establece la severidad de la prueba.
using Allure.Net.Commons;
using Allure.Xunit.Attributes;
using Xunit;
public class TestLabels
{
[Fact]
[AllureSeverity(SeverityLevel.critical)]
public void TestCreateLabel()
{
// ...
}
}
using Allure.Net.Commons;
using Xunit;
public class TestLabels
{
[Fact]
public void TestCreateLabel()
{
AllureApi.SetSeverity(SeverityLevel.critical);
// ...
}
}
Label
[AllureLabel(string label, string value, bool overwrite=false)]
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.
using Allure.Xunit.Attributes;
using Xunit;
public class TestLabels
{
[Fact]
[AllureLabel("MyCustomLabel", "value")]
public void TestCreateLabel()
{
// ...
}
}
using Allure.Net.Commons;
using Xunit;
public class TestLabels
{
[Fact]
public void TestCreateLabel()
{
AllureApi.AddLabel("MyCustomLabel", "value");
// ...
}
}
ID
[AllureId(string value)]
Establece el ID de la prueba.
using Allure.Xunit.Attributes;
using Xunit;
public class TestLabels
{
[Fact]
[AllureId("123")]
public void TestCreateLabel()
{
// ...
}
}
Link
[AllureLink(string name, string url)]
[AllureIssue(string name)]
[AllureIssue(string name, string url)]
[AllureTms(string name)]
[AllureTms(string name, string url)]
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.
Basado en el type
(que puede ser cualquier cadena), Allure intentará cargar un patrón de enlace correspondiente para procesar la URL, según lo definido por la opción de configuración links
. Si no se encuentra un patrón para el tipo dado, la URL se dejará sin modificar.
El name
se usará como el texto del enlace. Si se omite, se usará la URL no procesada en su lugar.
Para mayor comodidad, Allure proporciona atributos y métodos abreviados con tipos de enlace preseleccionados: issue
y tms
.
using Allure.Xunit.Attributes;
using Xunit;
public class TestLabels
{
[Fact]
[AllureLink("Website", "https://dev.example.com/")]
[AllureIssue("UI-123")]
[AllureTms("TMS-456")]
public void TestCreateLabel()
{
// ...
}
}
using Allure.Net.Commons;
using Xunit;
public class TestLabels
{
[Fact]
public void TestCreateLabel()
{
AllureApi.AddLink("Website", "https://dev.example.com/");
AllureApi.AddIssue("UI-123");
AllureApi.AddTmsItem("TMS-456");
// ...
}
}
Jerarquía basada en el comportamiento
[AllureEpic(string epic)]
[AllureFeature(params string[] feature)]
[AllureStory(params string[] story)]
AllureApi.AddEpic(string epic)
AllureApi.AddFeature(string feature)
AllureApi.AddStory(string story)
Asigna nombres de epics, características o historias de usuario para una prueba, como parte de la jerarquía basada en el comportamiento de Allure.
using Allure.Xunit.Attributes;
using Xunit;
[AllureEpic("Web interface")]
[AllureFeature("Essential features")]
public class TestLabels
{
[Fact]
[AllureStory("Labels")]
public void TestCreateLabel()
{
// ...
}
}
using Allure.Net.Commons;
using Xunit;
public class TestLabels
{
[Fact]
public void TestCreateLabel()
{
AllureApi.AddEpic("Web interface");
AllureApi.AddFeature("Essential features");
AllureApi.AddStory("Labels");
// ...
}
}
Jerarquía basada en la suite
[AllureParentSuite(string parentSuite)]
[AllureSuite(string suite)]
[AllureSubSuite(string subSuite)]
AllureApi.AddParentSuite(string parentSuite)
AllureApi.AddSuite(string suite)
AllureApi.AddSubSuite(string subSuite)
Asigna el nombre de la suite, como parte de la jerarquía basada en la suite de Allure.
using Allure.Xunit.Attributes;
using Xunit;
[AllureParentSuite("Web interface")]
[AllureSuite("Essential features")]
public class TestLabels
{
[Fact]
[AllureSubSuite("Labels")]
public void TestCreateLabel()
{
// ...
}
}
using Allure.Net.Commons;
using Xunit;
public class TestLabels
{
[Fact]
public void TestCreateLabel()
{
AllureApi.AddParentSuite("Web interface");
AllureApi.AddSuite("Essential features");
AllureApi.AddSubSuite("Labels");
// ...
}
}
Pasos de prueba
[AllureStep]
[AllureStep(string name)]
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 los pasos de la prueba.
Existen tres formas de definir un paso.
Pasos basados en atributos
Define un método que contenga un paso de prueba y agrega el atributo
[AllureStep]
a este, con un argumento opcionalname
(por defecto es el nombre de la función). Cada vez que la función sea llamada durante la ejecución de la prueba, se creará un nuevo paso para el informe de prueba. Si la función llama a otra función que también tiene el atributo[AllureStep]
, Allure Report creará un subpaso dentro del paso actual. Si la función lanza una excepción, el paso se considerará Fallido o Roto según el parámetro de configuraciónfailExceptions
.Si el nombre del paso contiene marcadores de posición (por ejemplo,
{url}
o{0}
), estos serán reemplazados con los valores de los parámetros pasados a la función.Los argumentos pasados a la función se agregarán a la lista de parámetros del paso. Se renderizarán de la misma manera que se describe en Pruebas parametrizadas, pero se mostrarán en el subárbol del paso actual en el informe. Usa el atributo
[Name(string name)]
para personalizar el nombre de un parámetro, como se muestra en el ejemplo a continuación. Usa el atributo[Skip]
para no agregar un parámetro al informe.Usa
AllureLifecycle.Instance.UpdateStep()
para agregar parámetros personalizados al paso actual, como se muestra en el ejemplo a continuación.Pasos en lambda
Escribe un 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á al informe. Si la función lanza una excepción, el paso se considerará Fallido o Roto según el parámetro de configuraciónfailExceptions
.Usa
AllureLifecycle.Instance.UpdateStep()
para agregar parámetros personalizados al paso actual, como se muestra en el ejemplo a continuación.Pasos no operativos
Si llamas a
Step()
con un nombre pero sin una función lambda, Allure agregará un paso no operativo al informe. Esto permite un informe estilo registro dentro de una prueba o dentro de un paso más grande. Un paso no operativo termina inmediatamente después de comenzar y no puede tener subpasos, parámetros ni archivos adjuntos.
using Allure.Net.Commons;
using Allure.Xunit.Attributes.Steps;
using Xunit;
public class TestMyWebsite
{
[Fact]
public void TestVisitPages()
{
TestDomain("https://domain1.example.com/");
TestDomain("https://domain2.example.com/");
}
[AllureStep("Test {url}")]
private void TestDomain([Name("Webpage URL")] string url)
{
AllureLifecycle.Instance.UpdateStep(stepResult =>
stepResult.parameters.Add(
new Parameter {
name = "Started at",
value = DateTime.Now.ToString()
}
)
);
OpenBrowser();
GoToWebpage(url);
CloseBrowser();
}
[AllureStep("Open web browser")]
private void OpenBrowser()
{
// ...
}
[AllureStep("Visit {url}")]
private void GoToWebpage([Skip] string url)
{
// ...
}
[AllureStep("Close web browser")]
private void CloseBrowser()
{
// ...
}
}
using Allure.Net.Commons;
using Xunit;
public class TestMyWebsite
{
[Fact]
public void TestVisitPages()
{
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...");
// ...
});
}
}
}
Métodos Constructor y Dispose
[AllureBefore(string name = null)]
[AllureAfter(string name = null)]
Agrega información sobre un constructor o un método Dispose()
que maneje un contexto de prueba, consulta la documentación de xUnit.net.
Los métodos se mostrarán en el informe de la prueba como tipos especiales de pasos.
using Allure.Xunit.Attributes.Steps;
using Xunit;
public class TestLabels : IDisposable
{
[AllureBefore("Setup test context")]
public TestLabels()
{
// ...
}
[Fact]
public void TestCreateLabel()
{
// ...
}
[AllureAfter("Clean test context")]
public void Dispose()
{
// ...
}
}
Pruebas parametrizadas
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)
AllureLifecycle.Instance.AddTypeFormatter<T>(TypeFormatter<T> typeFormatter)
Para soportar el patrón de pruebas parametrizadas, Allure Report detecta automáticamente los parámetros especificados a través de [Theory]
y otros atributos de xUnit.net. Además de esto, se puede utilizar la API en Tiempo de Ejecución para agregar parámetros incluso a funciones sin atributos de xUnit.net.
Si el argumento excluded
se establece en verdadero, Allure no usará el parámetro al comparar el resultado actual de la prueba con el anterior en el historial. Este argumento solo es utilizado por Allure TestOps.
El argumento mode
afecta cómo se mostrará el parámetro en el informe. Las opciones disponibles se definen en la enumeración ParameterMode
:
ParameterMode.Default
(igual que 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 será ocultado. 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, ten en cuenta que aún es posible extraer el valor desde el directorioallure_results
si lo publicas.
Por defecto, Allure Report renderizará los valores de los parámetros mediante una serialización JSON básica. Puedes anular este comportamiento para ciertos tipos implementando una clase personalizada que herede de TypeFormatter
y pasando un objeto de esta clase a AddTypeFormatter()
.
Los parámetros pueden ser agregados no solo a los resultados completos de la prueba, sino también a pasos individuales dentro de ellos, consulta Pasos de prueba para más detalles.
using Xunit;
public class TestLabels
{
[Theory]
[InlineData("johndoe", "qwerty")]
[InlineData("[email protected]", "qwerty")]
public void TestCreateLabel(string login, string password)
{
// ...
}
}
using Allure.Net.Commons;
using Xunit;
public class TestLabels
{
[Fact]
public void TestAuthenticationWithUsername()
{
AllureApi.AddTestParameter("login", "johndoe");
AllureApi.AddTestParameter("password", "qwerty", ParameterMode.Masked);
// ...
}
[Fact]
public void TestAuthenticationWithEmail()
{
AllureApi.AddTestParameter("login", "[email protected]");
AllureApi.AddTestParameter("password", "qwerty", ParameterMode.Masked);
// ...
}
}
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 name
dado.
TIP
Puedes usar datos generados por cualquier función, no necesariamente leídos de un archivo real.
Para crear un archivo adjunto utilizando la API en Tiempo de Ejecución, llama a AddAttachment()
en cualquier punto 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 muestre los archivos adjuntos correctamente, se recomienda especificar el tipo de cada archivo adjunto. Para ello, 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 de nombre de archivo se agrega al nombre del archivo cuando el usuario desea guardar el archivo.
using System.IO;
using System.Text;
using Allure.Net.Commons;
using Xunit;
public class TestLabels
{
[Fact]
public void TestCreateLabel()
{
// ...
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 xUnit.net también proporciona una función dedicada AddScreenDiff()
para adjuntar comparaciones visuales.