Otomatik Mühendis
Test Attribute ve Annotation'ları
Çeşitli test frameworklerinde sıklıkla kullanılan Attribute ve Annotation'lar
Aşağıdaki tabloda NUnit, MSTest, xUnit.net ve JUnit test frameworklerinde sıklıkla kullandığımız Attribute ve Annotation’ları açıklamarıyla birlikte görebilirsiniz.
JUnit için en iyi örnekleri Guru99 sitesinde bulabilirsiniz.
NUnit | MSTest | xUnit.net | JUnit | Açıklama |
---|---|---|---|---|
[TestFixture] | [TestClass] | - | - | Class’ın test içerdiğini belirtir. |
[Test] | [TestMethod] | [Fact] | @Test | Method’un test case’i olduğunu belirtir. |
[OneTimeSetUp] | [ClassInitialize] | IClassFixture |
@BeforeClass | Testler başlamadan önce tek sefer çalışacak method. |
[OneTimeTearDown] | [ClassCleanup] | IClassFixture |
@AfterClass | Testler tamamlandıktan sonra tek sefer çalışacak method. |
[SetUp] | [TestInitialize] | Constructor | @Before | Her testten önce çalışacak methoddur. |
[TearDown] | [TestCleanup] | IDisposable.Dispose | @After | Her test tamamlandıktan sonra çalışacak methoddur. |
[Ignore] | [Ignore] | [Fact(Skip=”reason”)] | @Ignore | Test case olmasına rağmen çalıştırılmasını istemediğimiz methodları bununla işaretleyebiliriz. |
[Category(“”)] | [TestCategory(“”)] | [Trait(“Category”, “”)] | @Category(*.class) | Testleri kategoriler halinde sınıflandırmamızı sağlar. |
xUnit diğerlerinden farklı olarak Attribute veya Annotation kullanmak yerine kalıtımın getirdiği methodları kullanmayı tercih etmiştir.
Testlerde Category kullanımı best practice olarak geçmektedir. Test runner aracınızda kategorilere göre görüntüleyebilir veya bir Continuous Integration aracında testlerinizi kategorilerine göre çalıştırabilirsiniz.
Geçici olarak çalıştırmak istemediğiniz test caselerinizde, Ignore kullanabilirsiniz. Ignore kullanmak yerine test tanımının silinmesi halinde bir daha asla o testi bulamayabilirsiniz. Ignore olarak işaretlenen methodlar test runner aracınızda veya test raporunuzda verdiğiniz mesajla görüntülenir.
Test Explorer üzerinde görünümü
Jenkins CI test raporunda görünümü
Yukarıda kullandığımız attribute’larının sırasını daha iyi görebilmek için aşağıdaki şekilde bir test hazırlayabiliriz;
Öncelikle test edeceğimiz methodu yazalım. Yeni bir Class Library projesi oluşturup aşağıdaki class’ı yazarız;
1
2
3
4
5
6
7
8
9
10
namespace OtomatikMuhendis.TestSample
{
public class DivideClass
{
public static int DivideMethod(int numerator, int denominator)
{
return (numerator / denominator);
}
}
}
Daha sonra Solution’a Unit Test Project ekler ve daha önce oluşturduğumuz projeyi buna referans olarak ekleriz.
Unit Test class’ımızı da aşağıdaki şekilde oluştururuz.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OtomatikMuhendis.TestSample;
using System.Diagnostics;
namespace OtomatikMuhendis.UnitTest
{
[TestClass]
public sealed class DivideClassTest
{
[AssemblyInitialize]
public static void AssemblyInit(TestContext context)
{
Debug.WriteLine("AssemblyInit " + context.TestName);
}
[ClassInitialize]
public static void ClassInit(TestContext context)
{
Debug.WriteLine("ClassInit " + context.TestName);
}
[TestInitialize]
public void Initialize()
{
Debug.WriteLine("TestMethodInit");
}
[TestMethod]
[TestCategory("MathLibTests")]
public void DivideMethod_DivideByOne_ResultIsEqual()
{
//Arrenge
var numerator = 6;
var denominator = 1;
//Act
var result = DivideClass.DivideMethod(numerator, denominator);
//Assert
Assert.AreEqual(numerator, result);
Debug.WriteLine("TestMethod_DivideMethod_DivideByOne_ResultIsEqual");
}
[TestMethod]
[TestCategory("MathLibTests")]
public void DivideMethod_DivideByTwo_ResultIsHalf()
{
//Arrenge
var numerator = 6;
var denominator = 2;
//Act
var result = DivideClass.DivideMethod(numerator, denominator);
//Assert
Assert.AreEqual(numerator, result * denominator);
Debug.WriteLine("TestMethod_DivideMethod_DivideByTwo_ResultIsHalf");
}
[TestMethod]
[TestCategory("MathLibTests")]
[ExpectedException(typeof(System.DivideByZeroException))]
[Ignore]
public void DivideMethod_DivideByZero_ThrowsDivideByZeroException()
{
//Arrenge
var numerator = 6;
var denominator = 0;
//Act
var result = DivideClass.DivideMethod(numerator, denominator);
//Assert
Assert.AreEqual(numerator, result * denominator);
Debug.WriteLine("TestMethod_DivideMethod_DivideByZero_ThrowsDivideByZeroException");
}
[TestCleanup]
public void Cleanup()
{
Debug.WriteLine("TestMethodCleanup");
}
[ClassCleanup]
public static void ClassCleanup()
{
Debug.WriteLine("ClassCleanup");
}
[AssemblyCleanup]
public static void AssemblyCleanup()
{
Debug.WriteLine("AssemblyCleanup");
}
}
}
Son olarak da çıktımız aşağıdaki şekilde olacaktır;
AssemblyInit DivideMethod_DivideByOne_ResultIsEqual
ClassInit DivideMethod_DivideByOne_ResultIsEqual
TestMethodInit
TestMethod_DivideMethod_DivideByOne_ResultIsEqual
TestMethodCleanup
TestMethodInit
TestMethod_DivideMethod_DivideByTwo_ResultIsHalf
TestMethodCleanup
ClassCleanup
AssemblyCleanup