Kino é um dialeto de Cucumber Gherkin para .NET/CShap.
A ideia é produzir testes unitários utilizando um jargão BusinessReadableDSL, meio que parecido com isso:
using E5R.Kino;
namespace My.App.Utils.Test.Target1
{
// [HEADER]
Feature("Somar")
("Calcula a soma entre números inteiros,")
("produzindo resultados matematicamente coerentes.");
Scenario("Números positivos devem ser somados")
.Given("Número 1 como @n1")
.And("Número 2 como @n2")
.When("Eu acionar somar!", (input)
=> new Result {
r = Calculadora.Somar(input.n1, input.n2) })
.Then("O resultado obtido é @r", (expected, result)
=> Assert.Equal(expected.r, result.r))
.Expectancy()
.In(new Input {
n1 = 999,
n2 = 1 })
.Out(new Output{
r = 1000 })
.In(new Input {
n1 = 47,
n2 = 53 })
.Out(new Output{
r = 100 });
// [FOOTER]
}
Você teria uma assinatura de entradas, saídas e expectativas:
namespace My.App.Utils.Test.Target1
{
public struct Input
{
public int n1;
public int n2;
}
public struct Output
{
public int r;
}
public struct Result
{
public int r;
}
}
Para facilitar a leitura, no código inicial fizemos um folding da parte declarativa da classe. Em uma IDE como o Visual Studio ou Visual Studio Code fica bem legal a visualização e o foco é direcionado a descrição do cenário de teste.
#region HEADER
public class Target1Tests : Kino<Input, Output, Result> {
public Target1Tests() => {
#endregion
// Seu código de especificação do teste está aqui!
#region FOOTER
}}
#endregion
A execução dos testes produziria uma saída parecida com essa:
$ kino MyCompany.MyLib.dll
Starting test execution, please wait...
[MyCompany.Target1Tests]...................................[FAIL]
> Feature: Somar [fail]
# Scenario 1: Números positivos devem ser somados [fail]
---------------------------------------------------------------
Given Número 1 como 999
And Número 2 como 1
When Eu acionar somar!
Then O resultado obtido é 1000 [ok]
Given Número 1 como 47
And Número 2 como 53
When Eu acionar somar!
Then O resultado obtido é 100 [fail]
..... Error Message: Assert.Equal() Failure
..... Expected: 100
..... Actual: 98
---------------------------------------------------------------