Programování
Unit testy
Testovaní je velmi důležitá část na kterou se často zapomíná.
Eleminujeme riziko vzniku chyb, který vznikají v budoucnu při vývoji.
Funguje to na principu dalšího projektu, který naše vytvořené věci testovat.
Na přidání unit testů do projektu je potřeba vytvořit separatní nový projekt s jménem MSTest Test Project (.NET Core) Do projektu je také potřeba přidat referenci na náš projekt (ten hlavní), aby testovací projekt měl odkud brát třídy a zdroje.
Na přidání unit testů do projektu je potřeba vytvořit separatní nový projekt s jménem MSTest Test Project (.NET Core) Do projektu je také potřeba přidat referenci na náš projekt (ten hlavní), aby testovací projekt měl odkud brát třídy a zdroje.
Pracování s unitTesty
Máme vytvořenou metodu double Divide(int num1, int num2), která dělí čísla num1:num2 a vytvoříme na ní unit test.
Pokud dáme attribut [TestCleanup] metoda se spustí po ukončení testu
Užitečné je to v případě, když test zanechává za sebou nějaký zbytečný soubory
public class Calculator
{
public static double Divide(int num1, int num2)
{
double result = Convert.ToDouble(num1) / Convert.ToDouble(num2);
return result;
}
}
Nyní vytvoříme třídu CalculatorTest v projektu MSTest Test Project (.NET Core) s označením [TestClass] [TestMethod]
// Označíme, že chceme testovat třídu
[TestClass]
public class CalculatorTest
{
// Označíme, že chceme testovat tuto metodu
[TestMethod]
public void DivideTest()
{
//Definujeme hodnoty
int num1 = 10;
int num2 = 2;
//Definujeme jaký by měl být výsledek
double expectedResult = 5;
//Dostaneme vysledek
double result = Calculator.Divide(10, 2);
//Porovnáme
Assert.AreEqual(expectedResult, result);
}
}
Na základě výsledku nám vloží kladný nebo negativní výsledek, spouštění testu mužeme najít pod View > Test Explorer
Testování více dat
Zde budeme testovat více čísel najednou přes DataRow, která nám umožní nacpat čísla do parametrů.
[TestMethod]
[DataRow(10,2,5)] // 10:2 = 5
[DataRow(-30, -6, 5)] // 30:6 = 5
[DataRow(-30, 2, -15)] // -30:2 = -15
public void DivideTest(int num1, int num2, int expectedResult)
{
//Dostaneme vysledek
double result = Calculator.Divide(num1, num2);
//Porovnáme
Assert.AreEqual(expectedResult, result);
}
Pre-testové a Post-testové rutiny
Pokud dáme attribut [TestInitialize] metoda se spustí, vždy před daným testem Pokud dáme attribut [TestCleanup] metoda se spustí po ukončení testu
Užitečné je to v případě, když test zanechává za sebou nějaký zbytečný soubory
[TestClass]
public class TestClass
{
private int _poleProTest;
[TestInitialize]
public void InicializaceTestu()
{
// Inicializace proměnných a objektů pro každý test
_poleProTest = 10;
}
[TestMethod]
public void TestMetoda()
{
// Testování funkcionality s inicializovanými proměnnými
Assert.AreEqual(10, _poleProTest);
// ... další testovací kód ...
}
[TestCleanup]
public void UkonceniTestu()
{
// Uvolnění zdrojů a provedení úklidu po každém testu
_poleProTest = 0;
}
}
Testování formulářů
Jedná se čistě o uživatelský interface a to nelze testovat nijak. Jediný způsob je zkoumat chování uživatelů. Takzvaně UX design = user experience
Další možný příklady s Assert
[TestMethod]
public void Assert_AreEqual_Numbers()
{
// Arrange
var expected = 10;
var actual = 10;
// Act
Assert.AreEqual(expected, actual);
}
[TestMethod]
public void Assert_AreNotEqual_Numbers()
{
// Arrange
var expected = 10;
var actual = 15;
// Act
Assert.AreNotEqual(expected, actual);
}
[TestMethod]
public void Assert_IsTrue_Boolean()
{
// Arrange
var isTrue = true;
// Act
Assert.IsTrue(isTrue);
}
[TestMethod]
public void Assert_IsFalse_Boolean()
{
// Arrange
var isFalse = false;
// Act
Assert.IsFalse(isFalse);
}
[TestMethod]
public void Assert_IsNotNull_Object()
{
// Arrange
var obj = new object();
// Act
Assert.IsNotNull(obj);
}
[TestMethod]
public void Assert_IsNull_Object()
{
// Arrange
object obj = null;
// Act
Assert.IsNull(obj);
}
[TestMethod]
public void Assert_IsInstanceOfType_Object()
{
// Arrange
var obj = new String("Test");
// Act
Assert.IsInstanceOfType(obj, typeof(string));
}
[TestMethod]
public void Assert_ThrowsException_Method()
{
// Arrange
void MethodThatThrowsException()
{
throw new Exception("Test Exception");
}
// Act
Assert.ThrowsException<Exception>(MethodThatThrowsException);
}