Aracılığıyla paylaş


C++ için Microsoft Birim Test Çerçevesi ile C/C++ için Birim Testleri Yazma

Visual Studio'da, C++ ile yazılmış yönetilmeyen kod için birim testleri oluşturabilirsiniz.Yönetilmeyen kod bazen yerel kod adlandırılır.

Aşağıdaki yordam, başlamanıza yardımcı temel bilgileri içerir.Sonraki bölümlerde daha ayrıntılı adımları açıklayan bir kılavuz sağlar.

Yönetilmeyen bir kod DLL için birim testleri yazmak için

  1. Kullanım yerel Test projesi testleriniz için ayrı bir Visual Studio projesi oluşturmak için şablon.

    Proje bazı örnek test kodunu içerir.

  2. DLL test projesi için erişilebilir hale getirir:

    • #includebir .h DLL harici erişilebilir işlevlerini bildirimlerini içeren dosya.

      .h Dosya ile işaretlenen işlevi bildirimleri içermelidir _declspec(dllimport).Alternatif olarak, bir DEF dosyası kullanılarak yöntemleri verebilirsiniz.Daha fazla bilgi için bkz. İçeri ve Dışarı Aktarma.

      Birim testinizi test altındaki DLL'den verilen işlevler erişebilirsiniz.

    • DLL projesi için test projesinin başvurular Ekle:

      İçindeki özellikleri test projesi, genişletme ortak özellikleri, Framework ve başvurularıve seçin Başvuru Ekle.

  3. Testi projesinde, test sınıfları oluşturun ve TEST makro ve izin sınıfı aşağıdaki şekilde kullanarak yöntemleri test:

    #include "stdafx.h"
    #include <CppUnitTest.h>
    #include "..\MyProjectUnderTest\MyCodeUnderTest.h"
    using namespace Microsoft::VisualStudio::CppUnitTestFramework;
    TEST_CLASS(TestClassName)
    {
    public:
      TEST_METHOD(TestMethodName)
      {
        // Run a function under test here.
        Assert::AreEqual(expectedValue, actualValue, L"message", LINE_INFO());
      }
    }
    
    • Assertbir sınamasının sonucu doğrulamak için kullanabileceğiniz birçok statik işlevleri içerir.

    • LINE_INFO() Parametre isteğe bağlı.Durumlarda PDB dosyası yok olduğunda, bir hata konumunu tanımlamak test Çalıştırıcısı izin verir.

    • Test Kurulum ve temizleme yöntemlerini de yazabilirsiniz.Daha fazla bilgi için tanımı açın TEST_METHOD makro ve CppUnitTest.h yorumlarda okuyun

    • Test sınıfları iç içe olamaz.

  4. Testleri çalıştırmak için test gezginini kullanın:

    1. Üzerinde Görünüm menüsü, seçin diğer Windows, Test Gezgini.

    2. Visual Studio çözüm oluşturun.

    3. Test Gezgininde seçin tümünü Çalıştır.

    4. Daha ayrıntılı olarak Test Gezgini herhangi bir test araştırmak için:

      1. Bir hata iletisi ve yığın izleme gibi daha fazla ayrıntı için test adı seçin.

      2. Test adı (örneğin çift tıklatarak) hatası konuma veya test kodu gitmek için açın.

      3. Bir test için kısayol menüsünde seçin hata ayıklama seçili Test Hata Ayıklayıcı'test için.

Gözden geçirme: Yönetilmeyen DLL Test Gezgini ile geliştirme

Bu kılavuz, kendi DLL geliştirmek için uyum sağlayabilir.Asıl adımları aşağıdaki gibidir:

  1. Yerel testi projesi oluşturun.Testleri ayrı bir proje geliştirdiğiniz DLL oluşturulur.

  2. Bir DLL proje oluşturun.Bu kılavuz yeni bir DLL oluşturur, ancak varolan bir DLL sınama yordamı benzer.

  3. DLL işlevleri testlere görünür hale.

  4. Yinelemeli olarak testleri genişletmek.Kod geliştirme testleri tarafından neden bir "kırmızı-yeşil-düzenleme" döngü öneririz.

  5. Başarısız olan testleri hata ayıklama.Hata ayıklama modunda testler çalıştırabilirsiniz.

  6. Testleri tutma değiştirmeden yeniden Düzenle.Yeniden düzenleme dış davranışını değiştirmeden kod yapısını geliştirme anlamına gelir.Performans, genişletilebilirlik veya kod okunabilirliğini geliştirmek için bunu yapabilirsiniz.Amaç davranışını değiştirmek için değil olduğundan, kodu yeniden düzenleme bir değişiklik yapmadan sırasında testleri değiştirmeyin.Testleri, yeniden düzenleme ederken size hataları tanıtmak değil, sağlanmasına yardımcı olur.Bu nedenle bu tür testleri yoktu varsa daha çok daha fazlası güvenle değişiklik yapabilirsiniz.

  7. Karşılama denetleyin.Birim testleri kodunuzu daha fazla çalışma daha yararlı olur.Testleri tarafından kullanılmış, kodun hangi kısımlarının bulabilir.

  8. Dış kaynaklara birimleri yalıtmak.Genel olarak, bir DLL diğer geliştirdiğiniz, diğer DLL'leri, veritabanları veya uzak alt sistemleri gibi sistem bileşenlerine bağımlıdır.Bağımlılıkları öğesinden yalıtılmış her birim test etmek kullanışlıdır.Harici bileşenler yavaş çalışmasına testleri yapabilirsiniz.Geliştirme sırasında diğer bileşenleri tamamlanmamış olabilir.

Yerel birim testi projesi oluşturun

  1. Üzerinde dosya menüsü, seçin yeni, proje.

    İletişim kutusunda genişletin yüklü, şablonları, Visual C++, Test.

    Seçin yerel Test projesi şablonu.

    Bu örnekte, test projesinin adlı NativeRooterTest.

    C++ birim testi projesi oluşturma

  2. Yeni projede denetleunittest1.cpp

    Test projesi TEST_CLASS ve TEST_METHOD

    Dikkat edin:

    • Her test kullanılarak tanımlanmış TEST_METHOD(YourTestName){...}.

      Geleneksel işlevi imzanızı gerekmez.İmza TEST_METHOD makro tarafından oluşturulur.Makro void döndüren bir örneği işlev oluşturur.Ayrıca, test yöntemi hakkında bilgi döndüren bir statik işlev da oluşturur.Bu bilgileri, yöntem bulmak test gezginini sağlar.

    • Test yöntemlerini kullanarak sınıflar olarak gruplandırılır TEST_CLASS(YourClassName){...}.

      Testleri çalıştırdığınızda, her test sınıfının bir örneği oluşturulur.Test yöntemlerini belirtilmeyen bir sırada çağrılır.Önce ve her modülü, sınıf veya yöntemi sonra çağrılan özel yöntemleri tanımlayabilirsiniz.Daha fazla bilgi için düzenleme C++ testleri.

  3. Test Gezgininde testler olduğunu doğrulayın:

    1. Bazı test kodu Ekle:

      TEST_METHOD(TestMethod1)
      {
      Assert::AreEqual(1,1);
      }
      

      Dikkat Assert sınıfı, test yöntemlerini sonuçlarında doğrulamak için kullanabileceğiniz birkaç statik yöntemler sağlar.

    2. Test menüsünde, Çalıştır, Tüm Testler'ı seçin.

      Sınama oluşturur ve çalıştırır.

      Test gezginini görüntülenir.

      Test altında görünür testleri geçti.

      Birim Test Gezgini geçirilen bir test

Bir yönetilmeyen DLL projesi oluşturun

  1. Oluşturma bir Visual C++ kullanarak proje Win32 Proje şablonu.

    Bu örnekte, proje adı RootFinder.

    C++ Win32 projesi oluşturma

  2. Seçin DLL ve dışarı simgeleri Win32 Uygulama Sihirbazı'ndaki.

    Sembolleri dışa aktar seçeneği verilen yöntemleri bildirmek için kullanabileceğiniz bir kullanışlı makro oluşturur.

    C++ projesi Sihirbazı DLL ve simgeleri dışarı aktarmak için

  3. Asıl .h dosyasına dışarı aktarılan bir işlevin bildirin:

    Yeni DLL kod proje ve .h dosyası API makrolarla

    Bildiricisi __declspec(dllexport) dışında DLL görünür olmasını ortak ve korumalı sınıf üyeleri neden olur.Daha fazla bilgi için bkz. C++ Sınıflarında dllimport ve dllexport Kullanma.

  4. Asıl .cpp dosyasında işlev için en az bir gövde Ekle:

    // Find the square root of a number.
    double CRootFinder::SquareRoot(double v)
    {
      return 0.0;
    }
    

Birkaç DLL projesi için test projesi

  1. DLL projesi için test projesinin proje başvurularını Ekle:

    1. Test projesinin özelliklerini açın ve seçin ortak özellikleri, Framework ve başvuruları.

      C++ proje özellikleri - çerçevesi ve referansları

    2. Seçin yeni bir başvuru ekleyin.

      İçindeki Başvuru Ekle iletişim kutusunda, DLL projeyi seçin ve seçin Ekle.

      C++ proje özellikleri - yeni başvuru Ekle

  2. Asıl birim testi .cpp dosyasında DLL kodunun .h dosyası şunlardır:

    #include "..\RootFinder\RootFinder.h"
    
  3. Dışarı aktarılan işlevini kullanıyor basit bir sınama Ekle:

    TEST_METHOD(BasicTest)
    {
    CRootFinder rooter;
    Assert::AreEqual(
    // Expected value:
    0.0, 
    // Actual value:
    rooter.SquareRoot(0.0), 
    // Tolerance:
    0.01,
    // Message:
    L"Basic test failed",
    // Line number - used if there is no PDB file:
    LINE_INFO());
    }
    
  4. Çözümü oluşturun.

    Yeni test Test Gezgininde görünür.

  5. Test Gezgininde seçin tümünü Çalıştır.

    Birim testi Explorer - temel Test geçirilen

Test ve kod projeleri ayarlayın ve işlevleri kod projede test çalıştırabilirsiniz doğrulandı.Şimdi, gerçek sınamaları ve kod yazmak başlayabilirsiniz.

Tekrarlayarak testleri genişletmek ve onları geçir

  1. Yeni test Ekle:

    TEST_METHOD(RangeTest)
    {
      CRootFinder rooter;
      for (double v = 1e-6; v < 1e6; v = v * 3.2)
      {
        double actual = rooter.SquareRoot(v*v);
        Assert::AreEqual(v, actual, v/1000);
      }
    }
    
    İpucuİpucu

    Başarılı olan testler değiştirmeyin öneririz.Bunun yerine, yeni bir test ekleyin, böylece test başarılı kodu güncelleştirin ve sonra başka bir test ekleyin ve benzeri.

    Kullanıcılarınızın gereksinimlerine değiştirdiğinizde, artık doğru sınamalarını devre dışı bırakın.Yeni testleri yazmak ve bunları birer birer, aynı artımlı biçimde çalışır duruma getirin.

  2. Çözümü oluşturun ve Test Gezgininde seçin tümünü Çalıştır.

    Yeni test başarısız olur.

    RangeTest başarısız

    İpucuİpucu

    Hemen yazdıktan sonra her test başarısız olduğunu doğrulayın.Bu, hiçbir zaman başarısız bir test yazma kolay hata önlemek yardımcı olur.

  3. Yeni test sağlayacak şekilde test altındaki kodun geliştirmek:

    #include <math.h>
    ...
    double CRootFinder::SquareRoot(double v)
    {
      double result = v;
      double diff = v;
      while (diff > result/1000)
      {
        double oldResult = result;
        result = result - (result*result - v)/(2*result);
        diff = abs (oldResult - result);
      }
      return result;
    }
    
  4. Çözümü oluşturun ve Test Gezgininde seçin tümünü Çalıştır.

    Her iki testleri geçirin.

    Birim testi Explorer - aralık Test geçirilen

    İpucuİpucu

    Kod bir kerede bir testleri ekleyerek geliştirin.Tüm sınamalar başarılı sonra her yineleme emin olun.

Başarısız olan test hata ayıklama

  1. Başka bir test Ekle:

    #include <stdexcept>
    ...
    // Verify that negative inputs throw an exception.
    TEST_METHOD(NegativeRangeTest)
    {
      wchar_t message[200];
      CRootFinder rooter;
      for (double v = -0.1; v > -3.0; v = v - 0.5)
      {
        try 
        {
          // Should raise an exception:
          double result = rooter.SquareRoot(v);
    
          _swprintf(message, L"No exception for input %g", v);
          Assert::Fail(message, LINE_INFO());
        }
        catch (std::out_of_range ex)
        {
          continue; // Correct exception.
        }
        catch (...)
        {
          _swprintf(message, L"Incorrect exception for %g", v);
          Assert::Fail(message, LINE_INFO());
        }
      }
    }
    
  2. Çözümü oluşturun ve seçin tümünü Çalıştır.

  3. Başarısız test açın (veya çift tıklatın).

    Başarısız assertion vurgulanır.Hata iletisi Test Gezgini ayrıntı bölmesinde görünür olur.

    NegativeRangeTests başarısız oldu

  4. Neden sınama başarısız görmek için işlev adım:

    1. Bir kesme noktası SquareRoot işlev başlangıcında ayarlayın.

    2. Başarısız test kısayol menüsünde seçin Seçili testler hata ayıklama.

      Kodlardan Çalıştır kesme noktasında durduğunda adım.

  5. Kod geliştirdiğiniz işlevinde Ekle:

    #include <stdexcept>
    ...
    double CRootFinder::SquareRoot(double v)
    {
        // Validate parameter:
        if (v < 0.0) 
        {
          throw std::out_of_range("Can't do square roots of negatives");
        }
    
  6. Tüm sınamalar şimdi geçirin.

    Tüm testler başarılı

Kod testleri değiştirmeden yeniden Düzenle

  1. SquareRoot işlev merkezi hesaplamadaki basitleştirin:

    // old code:
    //   result = result - (result*result - v)/(2*result);
    // new code:
         result = (result + v/result)/2.0;
    
  2. Çözümü oluşturun ve seçin tümünü Çalıştır, bir hata sunulmuştur değil olduğundan emin olun.

    İpucuİpucu

    Birim testleri iyi kümesini kodu değiştirdiğinizde, hataları sunulmuştur değil, güven sunar.

    Diğer değişikliklerden ayrı edilebilmesi tutun.

Sonraki adımlar

  • **Yalıtım.**Çoğu DLL'leri veritabanları ve diğer DLL'leri gibi diğer alt sistemleri bağlıdır.Bu diğer bileşenleri genellikle paralel olarak geliştirilen.Birim testi diğer bileşenlerini henüz kullanılamayan sırada gerçekleştirilecek izin vermek için sahte yerine sahip veya

  • **Doğrulama testleri oluşturun.**Aralıklarla takımınızın yapı sunucusunda yapılan testleri olabilir.Bu iş birkaç takım üyelerinin tümleştirildiğinde hataları sunulan değil, sağlar.

  • **İade etme sınar.**Her takım üyesinin kaynak denetimine kodu iade etmeden önce bazı testleri gerçekleştirilen ileminin hızla gerçekletirilmesi.Genellikle bu bir alt yapı doğrulama testlerini tam kümesini kümesidir.

    Siz de kod kapsamı en az bir düzeyde ileminin hızla gerçekletirilmesi.

Ayrıca bkz.

Görevler

İzlenecek yol: Dinamik Bağlantı Kitaplığı Oluşturma ve Kullanma (C++)

Kavramlar

Test Gezgini ile mevcut C++ uygulamalarında birim testi

Microsoft.VisualStudio.TestTools.CppUnitTestFramework Kullanma

İçeri ve Dışarı Aktarma

Diğer Kaynaklar

Yönetilen ve yönetilmeyen kod birlikte çalışabilirlik genel bir bakış

Yerel Kodda Hata Ayıklama