24 Kasım 2014 Pazartesi

CPPUnit

Not : JUnit başlıklı yazıya bakabilirsiniz.
Örnek Test
-----------------------
header dosyası
 #include "cppunit/TestFixture.h"
 #include "cppunit/extensions/HelperMacros.h"

class MyTester : public CPPUNIT_NS::TestFixture {
public:
 void testMethod1();

CPPUNIT_TEST_SUITE (MyTester);
CPPUNIT_TEST (testMethod1);
CPPUNIT_TEST_SUITE_END();
};

-------------------
cpp dosyası

CPPUNIT_TEST_SUITE_REGISTRATION(MyTester);

void MyTester::testMethod1(){
}

Koşulları sınamak için kullanılan macrolar şöyle:
CPPUNIT_ASSERT (condition)
Assert that condition is true. Verilen koşulun doğruluğunu dener.Örnek:
void ScreenScrapeTest::fileTest()
{
    CPPUNIT_ASSERT(ScreenScrape::getFile());   // test file validity
}
Diğer örnekler:
CPPUNIT_ASSERT(nullptr == some_class_ptr);
veya
CPPUNIT_ASSERT(!some_class_ptr);
CPPUNIT_FAIL(message): 
Fail with the given message.

CPPUNIT_ASSERT_MESSAGE (message,condition)
Assert that condition is true, and fail with message if it is not.

CPPUNIT_ASSERT_EQUAL (expected,actual)
Assert that expected equals actual.Note that expected and actual needs to be of the same type.
Verilen aynı tipteki iki değişkenin değerlerinin eşitliğini kontrol eder. Eğer iki değişken aynı tipte değilse derleme hatası alırız.

CPPUNIT_ASSERT_DOUBLES_EQUAL
Verilen iki kayan nokta sayının belli bir aralıkta yakın olup olmadığını dener.
C++'ta Private Yaratılan Sınıf  Nasıl Test Edilir
Örnek C#'ta ancak konuya uygun olduğu için aldım. Elimizdeki sınıf ISomething nesnesini kendi yaratıyor olsun. Eğer Bu sınıfı test amacıyla mocklamak istiyorsak, yeni bir constructor eklenebilir. Bu yöntemin kötü olduğunu iddia edenler de var. Ben daha iyi bir yöntem bilmiyorum.
public class MyClass
{
    private ISomething mySomething;

    public MyClass() { mySomething = new Something();  }

    /// <summary>
    /// Constructor - ONLY USE THIS FOR UNIT TESTING
    /// </summary>
    public MyClass(ISomething something) { mySomething = something; }

}

C++'ta Private Metod Nasıl Test Edilir
Bence private metod, public metodları kullanarak test edilmeli. Ancak yinede private metodu tek başına test etmek istiyorsak şu çözümler kullanılabilir.
  1. private metodu çağırabilen bir friend class yaratmak.
  2. private metodu virtual yapmak ve bir başka sınıfta override etmek. Herb Sutter'ın yazısında "Prefer to Make Virtual Functions Private" maddesine bakılabilir
  3. Memory Layout kullanmak. Herb Sutter'ın Uses and Abuses of Access Rights yazısına bakılabilir.
Memory Layout Örneği
Test etmek istediğimiz sınıf ile aynı layout'a sahip (taklit) bir başka sınıf yaratıyoruz. Daha sonra reinterpret_cast ile test etmek istediğimiz nesneyi taklit nesneye çevirip private metoduna erişiyoruz. Örnek:
class X 
{ 
public:
  X() : private_(1) { /*...*/ }

private: 
  int Value() { return private_; }
  int private_; 
};

// Nasty attempt to simulate the object layout
// (cross your fingers and toes).
//
class BaitAndSwitch
    // hopefully has the same data layout as X
{   // so we can pass him off as one
public:
  int Value() { return private_; }
private:
  int private_;
};

int mytestMethod( X& x )
{
  // evil laughter here
  return (reinterpret_cast<BaitAndSwitch&>(x)).Value();
}
Daha sonra X sınıfını şöyle kullanıyoruz.
int main()
{
    X x;
    std::cout << mytestMethod(x) << "\n"; // prints 0, not 1
    return 0;
}; 






Hiç yorum yok:

Yorum Gönder