Aracılığıyla paylaş


Birim Test Explorer ile yerel kod sınama

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

Aşağıdaki yordam başlamanızı sağlamak önemli bilgiler içerir.Sonraki bölümlerde daha ayrıntılı adımları açıklayan bir anlatım sağlayın.

Birim testleri için bir dll yönetilmeyen kod yazmak için

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

    Projenin bazı örnek test kodunu içerir.

  2. dll test projesi için erişilebilir duruma:

    • #includebir .h Dışarıdan erişilebilen dll işlevlerini bildirimlerini içeren dosya.

      .h Dosyası ile işaretlenmiş işlevi bildirimlerini içeren _declspec(dllimport).Alternatif olarak, yöntemler def dosyası kullanarak dışa aktarabilirsiniz.Daha fazla bilgi için bkz. Alma ve verme.

      Birim testleri, test altındaki DLL'den dışarı aktarılan işlevleri erişebilirsiniz.

    • dll projesi test projesinin başvurular ekleyin:

      İçinde özellikleri test projesini genişletin Ortak özellikleri, Framework ve başvurularseçin Add Reference.

  3. Test projesinde, test sınıfları oluşturmak ve yöntemleri test makrolar ve Assert sınıfı aşağıdaki gibi kullanarak 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 test sonucu doğrulamak için kullanabileceğiniz birkaç statik işlevler içerir.

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

    • Ayrıca, Kurulum ve temizleme yöntemleri test yazabilirsiniz.Daha fazla bilgi için açık tanımını TEST_METHOD makro ve CppUnitTest.h bulunan açıklamaları okuyun

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

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

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

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

    3. Sınama Gezgini'nde Tümünü Çalıştır seçeneğini seçin.

    4. Herhangi bir testi Test Gezgini daha ayrıntılı incelemek için:

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

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

      3. Bir test için kısayol menüsünden seçin Hata ayıklama seçili Test hata ayıklayıcıda testi çalıştırmak için.

İzlenecek yol: Test Gezgini ile yönetilmeyen dll geliştirme

Bu izlenecek yolda kendi dll geliştirmek için uyarlayabilirsiniz.Asıl adımları aşağıdaki gibidir:

  1. Yerel bir Test projesi oluşturma.Testleri ayrı bir proje geliştirdiğiniz DLL'den oluşturulur.

  2. dll projesi oluşturma.Bu izlenecek yolda yeni bir dll dosyası oluşturur, ancak varolan bir dll sınama yordamı benzer.

  3. dll işlevlerini testleri görünür yapmak.

  4. Testleri tekrarlayarak destekleyebilen.Bir "kırmızı-yeşil-düzenleme" döngüsü içinde kod geliştirme testleri tarafından dolaştırılır, öneririz.

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

  6. Testleri değişmeden tutarken yeniden.Yeniden düzenleme dış davranışını değiştirmeden kod yapısını geliştirme anlamına gelir.Performans, genişletilebilirlik ve kodun okunabilirliğini geliştirmek üzere bunu yapabilirsiniz.Amaç davranışını değiştirmek için değil, çünkü, kodu yeniden düzenleme değişiklik yapma sırasında testleri değiştirmeyin.Testler, yeniden düzenleme yaparken, hataların neden yok olduğunu sağlanmasına yardımcı olur.Bu nedenle bu tür testler değildi, daha çok daha güvenle değişiklik yapabilirsiniz.

  7. Kapsamı denetleme.Birim testleri daha kodunuzu çalıştıran daha yararlı olur.Kodunuzun hangi bölümlerinin testleri tarafından kullanılmış olan bulabilir.

  8. Dış kaynaklara birimlerinden ayırmak.Genellikle, bir dll diğer DLL'ler, veritabanlarına veya uzak alt sistemleri gibi geliştirdiğiniz sistemin diğer bileşenleri bağlıdır.Bağımlılıklarından yalıtma içindeki her birim test etmek kullanışlıdır.Harici bileşenler yavaş çalışmasına testler yapabilir.Geliştirme sırasında diğer bileşenler tamamlanmamış olabilir.

Yerel birim test projesi oluşturma

  1. Üzerinde Dosya menüsünden seçin Yeni, Proje.

    Genişlet iletişim kutusunda, yüklü, şablonları, Visual c++, Test.

    Seçim Yerel Test projesi şablonu.

    Bu izlenecek yolda, test projesi adlı NativeRooterTest.

    C++ Birim Test projesi oluşturma

  2. Yeni projede inceleyinunittest1.cpp

    Test projesi ile TEST_CLASS ve TEST_METHOD

    Dikkat edin:

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

      Geleneksel işlevi imza yazmak zorunda değil.İmza test_method makro tarafından oluşturulur.Makro void döndüren bir örnek işlevi oluşturur.Bu aynı zamanda test yöntemi hakkında bilgi döndüren statik bir işlev oluşturur.Test Gezgini yöntemi bulmak amacıyla bu bilgileri sağlar.

    • Test yöntemlerini kullanarak sınıf halinde 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 belirtilmemiş sırayla çağrılır.Önce ve sonra her modül, sınıf veya yöntemi çağrılan özel yöntemi tanımlayabilirsiniz.Daha fazla bilgi için bkz: c++ testleri düzenleme.

  3. Testleri Test Gezgini'nde çalıştığını doğrulayın:

    1. Bazı test kodu ekleyin:

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

      Dikkat Assert sınıfı yöntemleri test sonuçları doğrulamak için kullanabileceğiniz birkaç statik yöntem sağlar.

    2. Üzerinde Test menüsünden seçin çalıştırmak , Tüm testler.

      Test oluþturulur ve çalýþýr.

      Test Gezgini görüntülenir.

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

      Birim Test Explorer geçirilen bir test ile

Yönetilmeyen dll projesi oluşturma

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

    Bu izlenecek yolda, proje adı RootFinder.

    C++ Win32 Proje oluşturma

  2. Seçin dll ve sembolleri dışa Win32 Uygulama Sihirbazı'nda.

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

    C++ projesi Sihirbazı DLL ve sembolleri Dışa Aktar

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

    Yeni DLL kodu proje ve .h dosyası API makrolarla

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

  4. En az bir işlev gövdesi asıl .cpp dosyasına ekleyin:

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

Birkaç test projesine dll projesi

  1. dll projesi test projesinin proje başvuruları ekleyin:

    1. Test projesi özelliklerini açın ve Seç Ortak özellikleri, Framework ve başvuruları.

      C++ proje özellikleri - Framework ve başvurular

    2. Seçim Yeni Başvuru Ekle.

      İçinde Add Reference iletişim kutusuna, dll projeyi seçin ve seçim Ekle.

      C++ Proje Özellikleri - Yeni Başvuru Ekle

  2. Asıl birim test .cpp dosyasında dll kodunun .h dosyası şunları içerir:

    #include "..\RootFinder\RootFinder.h"
    
  3. Dışa aktarılan işlevini kullanan basit bir sınama ekleyin:

    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 Gezgini'nde görünür.

  5. Sınama Gezgini'nde Tümünü Çalıştır seçeneğini seçin.

    Birim Test Gezgini - temel Testi geçti

Varsa kod projelerinizin ve test ayarlamak ve doğrulanabilir işlevleri kod projesinde çalışan testleri çalıştırabilirsiniz.Şimdi gerçek testler ve kod yazmaya başlayabilirsiniz.

Tekrarlayarak testleri genişletmek ve bunların geçmesi

  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ştirmemenizi öneririz.Bunun yerine, yeni test Ekle, kodu güncelleştirerek test başarılı olur ve başka bir test ekleyin ve böyle devam eder.

    Kullanıcılarınızın gereksinimlerine değiştirdiğinizde, artık doğru testleri devre dışı bırakın.Yeni testler yazmak ve onları birer birer, artımlı aynı şekilde çalışır.

  2. Çözümü oluşturun ve Test Gezgini'nde seçin Çalıştırmak tüm.

    Yeni test başarısız olur.

    RangeTest başarısız

    İpucuİpucu

    Hemen yazdıktan sonra her testin başarısız olduğunu doğrulayın.Bu asla başarısız bir test yazma kolay hata önlemenize yardımcı olur.

  3. Böylece yeni test, test altındaki kodun geliştiren:

    #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 Gezgini'nde seçin Çalıştırmak tüm.

    Her iki testleri geçer.

    Birim Test Gezgini - aralık Testi geçti

    İpucuİpucu

    Kod testleri bir anda ekleyerek geliştirin.Tüm testlerin her yineleme başladıktan sonra başarılı olduğundan emin olun.

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

  1. Başka bir teste ekleyebilirsiniz:

    #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 Çalıştırmak tüm.

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

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

    NegativeRangeTests başarısız oldu

  4. Neden sınama başarısız görmek için işlevi aracılığıyla adım:

    1. SquareRoot işlevi başlangıcına kesme noktası ayarlayın.

    2. Başarısız testin kısayol menüsünden seçin Seçili testlerde Hata Ayıkla.

      Kesme noktasında çalışma sona erdiğinde, kod boyunca adım.

  5. Geliştirdiğiniz işlev kodu ekleyin:

    #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. Şimdi tüm testleri geçti.

    Tüm testler

Testleri değiştirmeden kodu yeniden

  1. Merkezi SquareRoot işlevi hesaplamada sadeleş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 Çalıştırmak tüm, hata sunulmuştur değil emin olun.

    İpucuİpucu

    Birim testleri iyi bir dizi kodu değiştirdiğinizde, hataları neden olmuş değil, güven verir.

    Diğer değişikliklerden ayrı düzenlemesi tutun.

Sonraki adımlar

  • Yalıtım. Çoğu DLL'ler, veritabanları ve diğer DLL'ler gibi diğer alt sistemler bağlıdır.Bu bileşenler, genellikle paralel olarak geliştirilir.Birim testi diğer bileşenleri henüz kullanılamayan sırada yapılması için izin vermek için düzeltebileceğinizi yerine sahip veya

  • Yapı doğrulama testleri. Takımınızın yapı sunucusunda belirlenen aralıklarda gerçekleştirilen testler olabilir.Bu iş birkaç takım üyelerinin entegre edildiğinde hataları sunulan değil, sağlar.

  • İade etme sınar. Her takım üyesinin kodunu kaynak denetimine iade etmeden önce bazı testlerin gerçekleştirilen gerçekletirilmesi.Genellikle bu yapı doğrulama testleri kümesinin bir alt kümesidir.

    Ayrıca kod kapsamı asgari düzeyde gerçekletirilmesi.

Ayrıca bkz.

Görevler

Walkthrough: Creating and Using a Dynamic Link Library (C++)

Kavramlar

Alma ve verme

Diğer Kaynaklar

Yönetilen ve yönetilmeyen kod ile birlikte işlerlik genel bakış

Yerel kod hata ayıklama