
Imutabilní kolekce v C#: na co si dát pozor?
S imutabilními kolekcemi se v C# setkáváme poměrně často, ale často si neuvědomujeme všechny možnosti, které máme, v čem přesně se liší, a jak vybrat tu správnou v daný moment.
Přejít na obsah|Přejít k hlavnímu menu|Přejít k vyhledávání
Reqnroll je nástroj pro práci s projekty a je nástupcem SpecFlow. Používá Gherkin k psaní testovacích případů v přirozených jazycích a podporuje více než 70 jazyků. Kromě angličtiny podporuje formát Gherkin mnoho dalších jazyků, jako je němčina, španělština a francouzština. Aby se předešlo komunikačním chybám způsobeným překlady, doporučuje se ponechat specifikace a popisy akceptačních testů v jazyce daného oboru.
Reqnroll používá Cucumber Expressions jako výchozí metodu pro propojení definic kroků s kroky.
Reqnroll usnadňuje automatizaci testování tím, že z ní činí týmovou práci, což umožňuje každému členovi týmu efektivněji využívat své dovednosti.
Použití BDD k určení akceptačních kritérií vám pomůže rychle identifikovat skryté detaily a zajistit, že je všichni interpretují stejným způsobem.
Různí členové týmu s jedinečnými názory mohou téma zkomplikovat. Použití Gherkinu pomáhá vytvořit společné porozumění pro celý tým.
V softwarovém inženýrství je behavior-driven development (BDD) proces vývoje softwaru, který podporuje spolupráci mezi vývojáři, odborníky na zajištění kvality a zástupci zákazníků na softwarovém projektu.
Zaměřte se na kódování – porozumění potřebám zainteresovaných stran
Zaměřte se na psaní testů v přirozeném jazyce namísto vytváření složitých testovacích kódů.
Reqnroll přeměňuje scénáře Gherkin na automatizované testy a pomáhá týmům propojit automatizaci s funkčními soubory, což usnadňuje sdílení výsledných příkladů.
Efektivnější spolupráce s vaším týmem.
Formulace je proces převodu klíčových příkladů z objevů do formální dokumentace, jako jsou snadno čitelné scénáře Gherkin.
Automatizace zahrnuje transformaci formalizovaných scénářů do automatizovaných akceptačních testů. Tyto testy výrazně snižují úsilí potřebné pro regresní testování a poskytují okamžitou zpětnou vazbu, když chování systému již neodpovídá dokumentaci jeho specifikací.
Vývojáři implementují definice kroků.
Soubory testů jsou nazývány feature a obsahují jednotlivé scénáře (1– N), viz níže.
Feature file “Calculator.feature” (vytvořeno testerem, product ownerem, vývojářem)
Feature: Calculator
Simple calculator for adding two numbers
@CalculatorXGherkin
Scenario: Add two numbers
Given the first number is 50
And the second number is 70
When the two numbers are added
Then the result should be 120
Scenario: Add two numbers 2
Given the first number is 10
And the second number is 10
When the two numbers are added
Then the result should be 20
Step definitions (vytvořeno vývojářem)
using NUnit.Framework;
namespace CalculatorXGherkin.StepDefinitions
{
[Binding]
public sealed class CalculatorStepDefinitions
{
int? firstNumber = null;
int? secondNumber = null;
[Given("the first number is {int}")]
public void GivenTheFirstNumberIs(int number)
{
firstNumber = number;
}
[Given("the second number is {int}")]
public void GivenTheSecondNumberIs(int number)
{
secondNumber = number;
}
[When("the two numbers are added")]
public void WhenTheTwoNumbersAreAdded()
{
Assert.That(firstNumber, Is.Not.Null);
Assert.That(secondNumber, Is.Not.Null);
}
[Then("the result should be {int}")]
public void ThenTheResultShouldBe(int result)
{
if (firstNumber + secondNumber != result)
{
throw new Exception($"Expected {result} but got {firstNumber + secondNumber}");
}
}
}
}
PS D:\Sources\CalculatorXGherkin> dotnet.exe test
Restore complete (1.1s)
CalculatorXGherkin net8.0 succeeded (1.2s) → bin\Debug\net8.0\CalculatorXGherkin.dll
NUnit Adapter 6.0.0.0: Test execution started
Running all tests in D:\Sources\CalculatorXGherkin\bin\Debug\net8.0\CalculatorXGherkin.dll
NUnit3TestExecutor discovered 2 of 2 NUnit test cases using Current Discovery mode, Non-Explicit run
Given the first number is 50
-> done: CalculatorStepDefinitions.GivenTheFirstNumberIs(50) (0.0s)
And the second number is 70
-> done: CalculatorStepDefinitions.GivenTheSecondNumberIs(70) (0.0s)
When the two numbers are added
-> done: CalculatorStepDefinitions.WhenTheTwoNumbersAreAdded() (0.0s)
Then the result should be 120
-> done: CalculatorStepDefinitions.ThenTheResultShouldBe(120) (0.0s)
Given the first number is 10
-> done: CalculatorStepDefinitions.GivenTheFirstNumberIs(10) (0.0s)
And the second number is 10
-> done: CalculatorStepDefinitions.GivenTheSecondNumberIs(10) (0.0s)
When the two numbers are added
-> done: CalculatorStepDefinitions.WhenTheTwoNumbersAreAdded() (0.0s)
Then the result should be 20
-> done: CalculatorStepDefinitions.ThenTheResultShouldBe(20) (0.0s)
NUnit Adapter 6.0.0.0: Test execution complete
CalculatorXGherkin test net8.0 succeeded (1.3s)
Test summary: total: 2, failed: 0, succeeded: 2, skipped: 0, duration: 1.3s
Build succeeded in 4.1s
Reqnroll lze využít i k testování webových aplikací.
Implementujeme kroky (step definitions) pro tlačítka, rozbalovací seznamy atd.
Například v projektu React použijeme k identifikaci testované položky speciální atribut „data-testid“.
Definice kroku (step definition)
/// <summary>
/// Button is located by attribute 'data-testid'
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
[Then(@"Click on button '([^']*)'")]
public async Task ThenClickOnButton(string id)
{
Button button = new(driver.Page, id);
await button.ClickOnButton();
}
// Implementace stisknutí tlačítka
internal class Button
{
private readonly string dataTestId;
private readonly IPage pageObject;
public Button(IPage page, string id)
{
dataTestId = id;
pageObject = page;
}
/// <summary>
/// Buton is located by data-testid attribute
/// </summary>
/// <returns></returns>
public async Task ClickOnButton()
{
ILocator button = pageObject.GetByTestId(dataTestId);
await Assertions.Expect(button).ToBeVisibleAsync();
await Click(button);
}
private async Task Click(ILocator button)
{
var isDisabled = await button.IsDisabledAsync();
if (!isDisabled)
{
await button.ClickAsync();
}
}
}
Feature file (vytvoření nového uživatele)
Feature: ProcessCreateUser
@PipelneServiceRole
@Createuser
Scenario: Create new user
Given I navigate to the application '/login'
And Login
When User logged
Then Go to Page '/settings'
When Page is '/settings'
Then Click on button 'usermanagement.tabtitle'
And Click on button 'usermanagement.createuser'
And Fill input 'createusermodal.username' with '#TestUserName2'
And ComboBox 'createusermodal.role' select item 'Service'
And Fill input 'createusermodal.password' with '#TestPassword'
And Fill input 'createusermodal.confirmpassword' with '#TestPassword'
And Click on button 'createusermodal.cancel'
Then Logout
Prefix ‘#’ označuje systémovou proměnnou operačního systému Microsoft Windows.
Formulář pro vytvoření uživatele

Taktéž můžeme testovat položky na jednotlivých webových stránkách

Testovaná stránka

Step definition
[Then(@"Validate items on page")]
public async Task ThenValidateItemsOnPage(Table table)
{
IEnumerable<PageItem> pageItems = table.CreateSet<PageItem>();
PageItems items = new PageItems(driver.Page, pageItems);
await items.CheckItems();
}
Zde vidíme načtení tabulky do proměnné, kterou následně procházíme
IEnumerable<PageItem> pageItems = table.CreateSet<PageItem>();
Detekce položky
public async Task<bool> CheckItems()
{
using var item = pageItems.GetEnumerator();
while (item.MoveNext())
{
string labelLocatorId = string.Empty;
ILocator labelLocator;
// Label
if (!string.IsNullOrEmpty(item.Current.Label))
{
labelLocator = page.GetByTestId(item.Current.Label);
await Assertions.Expect(labelLocator).ToBeVisibleAsync();
}
…
}
https://docs.reqnroll.net/latest/index.html#
https://docs.reqnroll.net/latest/integrations/externaldata.html
Podporované datové zdroje
soubory CSV (formát ‘CSV’, s příponou .csv)
soubory Excelu (formát Excel, přípony .xlsx, .xls, .xlsb)
https://docs.reqnroll.net/latest/automation/datatable-helpers.html

S imutabilními kolekcemi se v C# setkáváme poměrně často, ale často si neuvědomujeme všechny možnosti, které máme, v čem přesně se liší, a jak vybrat tu správnou v daný moment.
Děkujeme za váš zájem o odběr našeho newsletteru! Pro dokončení registrace je potřeba potvrdit vaše přihlášení. Na zadaný e-mail jsme vám právě zaslali potvrzovací odkaz. Klikněte prosím na tento odkaz, aby bylo vaše přihlášení dokončeno. Pokud e-mail nenajdete, zkontrolujte prosím složku nevyžádané pošty (spam) nebo složku hromadné pošty.
