Otomatik Mühendis

Test Attribute ve Annotation'ları

Çeşitli test frameworklerinde sıklıkla kullanılan Attribute ve Annotation'lar

günü tarafından yayınlandı.

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.

testingIgnore.png Test Explorer üzerinde görünümü

testingIgnoreJenkins.png 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");
    }
  }
}

testingProject.png Projenin son hali

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
test, nunit, xunit, mstest, junit Testing

Yazar: Olcay Bayram

Çeşitli teknoloji firmalarında çalışmış, yurtiçi ve yurtdışı farklı sektörlerden tecrübe edinmiş, derdini iki yabancı dilde anlatabilen bir yazılım uzmanı.