2013-05-22 9 views
21

VS2012 projesinde, DllImport pinvoke kullanarak bir VS2010 C++ DLL çağrısı yapan bazı C# birim testleri var.vstest keşif motoru kilitleme DLL'leri önleme

Test projesi için önceden oluşturulmuş bir olay olarak, DLL'nin en son sürümünü sınava ilişkin ikili projeye kopyalarım.

Vstest.discoveryengine çalışıyorsa, bu tekrar tekrar başarısız olur. Görünen o ki 'keşif motoru' testleri yükler ve kilidi DLL'de tutar.

Vstest keşif motorunu öldürürsem, o zaman testleri yapabilir ve çalıştırabilirim. aksi halde yapı başarısız olur ve VS2012 önceki bir sürümü çalıştırmayı önerir (bir 'bu mesajı bir daha gösterme' seçeneğine sahip olmayan bir model iletişim kutusuyla birlikte) •

Testi zorlamak için yapabileceğim bir şey var mı Gerçekten sınamaları çalıştırırken veya arka plan bulma yürütülebilir dosyasını devre dışı bırakmak için DLL'yi kaldırma projesi?

Vstest.discoveryengine.x86, vstest.executionengine.x86'yi öldüren Kealakekua adlı bir yürütülebilir dosya oluşturarak bir geçici çözümle karşılaştım ve bununla birlikte ön hazırlık olayının ilk kısmı olarak dosyaları kopyalayabilir ve yapılandırabilir ama dosyam için görsel stüdyosuyla dövüşmemeyi tercih ederim.

+0

DLL sınama sınıflarında kod aracılığıyla kod yüklemek için bir seçenek olabilir mi? – Joel

+0

@Joel not - testler DLL'yi doğrudan yüklemiyor, test ettikleri kod yok; Üretim kodunu işini yapmak için gerekli olandan daha fazla karmaşıklaştırmak istemem. Test kodu ile test edilen montaj arasındaki bağlantı test kodu tarafında kırılabilirse de bu işe yarayabilir. –

cevap

1

Benzer bir sorunla karşılaştım ve içinde herhangi bir sınama bulunmayan bir "Test" projesi oluşturdum. (Bir C++ kütüphanesi geliştiricisi olarak, belirli başlıkların CLR etkin olarak derlenebildiğinden emin olmak istedim, bu yüzden bunları CLR ile derlemek için sahte bir CLR projesi yaptım. Derlenmişse, bu iletildi.) vstest.discoveryengine tarafından süresiz olarak açık tutulur.

Projeye bir Ignored testi ekleyerek onu sabitledim. Ben vstest.discoveryengine dll tüm testler bulur kadar dll tutun, ama bulunacak bir test varsa, o zaman sonsuza kadar üzerinde tutacağını düşünüyorum.

ekledim testi (Ben varsayılan ayar testi olduğunu düşünüyorum)() yürütüldüğünde olmadığından emin olmak için TEST_IGNORE Not:

#include <CppUnitTest.h> 

namespace CLRTests 
{ 
    TEST_CLASS(CLRTestsClass) 
    { 
    public: 

     BEGIN_TEST_METHOD_ATTRIBUTE(CLRTest1) 
     TEST_OWNER(L"") 
     TEST_DESCRIPTION(L"") 
     TEST_PRIORITY(1) 
     TEST_IGNORE() 
     END_TEST_METHOD_ATTRIBUTE() 
     TEST_METHOD(CLRTest1) 
     { 
     // TODO: Your test code here 
     } 

    }; 
} 

Ben bu durumda mümkündür umuyoruz.

2

Son zamanlarda bu sorunu da yaşadım ve sorun kendi kullanıcı kodumdan kaynaklandı.

Test keşfi sırasında tüm test sınıfları oluşturuldu ve test sınıfı yapıcılarımızdan birinde oldukça karmaşık bir iş sınıfı başlatıldı. Sorun bunun başlatma sırasında bir arka plan iş parçacığı aşağıdaki yaptığını, yaratılmış olmasıdır:

socket.Read(...) 

Bu iş parçacığı bir sonucu bizim montaj kilitli gibi bazı soket veri gelmesi ve bekleyen sonsuza çalışan tuttu.

Bu yüzden benim için çözüm, test kodu bulma sırasında bu kodun aranmayacağından emin olmaktı.

Bazı aksamları kilitlediğinde Visual Studio'yu test bulma motoruna ekleyerek, bu sorundan etkileniyorsanız, denetleyebilirsiniz. Duraklatmaya bastıktan sonra normal olarak göreceksiniz, mevcut yürütme satırı kendi kullanıcı kodunuzda bir yerdedir (ayrıca Konular penceresini de kontrol edin).