DeploymentItem özniteliğiyle ilgili sorunlar


95

Şu anda C # .net ile yazılmış "eski" bir sistemi sürdürüyorum, bazı eski özellikleri kaldırıyorum ve bazı yeniden düzenleme yapıyorum. Tanrıya şükür, önceki adam bazı birim testleri (MSTest) yazdı. JUnit testleri konusunda oldukça rahatım, ancak MSTests ile henüz pek bir şey yapmadım.

Test yöntemlerinin, test DeploymentItemedilmekte olan iş mantığı yöntemi tarafından ayrıştırılan bir metin dosyasını ve DeploymentItemdağıtılması gereken bir grup TIF dosyasını içeren yalnızca bir yolun belirtildiği bir metin dosyasını belirten bir özniteliği vardır.

[TestMethod()]
[DeploymentItem(@"files\valid\valid_entries.txt")]
[DeploymentItem(@"files\tif\")]
public void ExistsTifTest()
{
   ...
}

Testler daha önce işe yaradı, ancak şimdi \ files \ tif dizininde bulunan TIF dosyalarının adlarını değiştirmek zorunda kaldım. Bir kurala göre, TIF dosya adları, ExistsTifTest()yöntem tarafından da kontrol edilen belirli bir modelle eşleşmelidir . Şimdi, onları yeni gereksinimlere uyarlamak için dosya adlarını değiştirmem gerekiyordu ve aniden TIF dosyaları eskisi gibi dağıtılmıyor.

Birisi bana bunun neden olduğu konusunda bir ipucu verebilir mi veya nedeni ne olabilir? Aynı şey, test yönteminde uygun DeploymentItem özniteliğiyle \ files \ valid \ dizinindeki "valid_entries.txt" nin yanına "my2ndTest.txt" diyen yeni bir metin dosyası eklersem de olur. Dosya dağıtılmıyor mu?

Şimdi, dağıtım yolunu doğrudan testrunconfig içinde tanımlayarak dağıtılmış görüntüleri elde ettim, ancak bu şeylerin neden olduğunu veya örneğin yeni dosyam "my2ndTest.txt" neden diğerleri yaparken konuşlandırılmadığını anlamak istiyorum.


2
Burada önemli olan, DeploymentItemAttribute'de belirtilen tüm öğelerin test derlemelerinizin çalıştırıldığı konuma kopyalanacağını fark etmektir. Başka bir deyişle, dizin yapınızı koruyacağını umuyorsanız, şansınız kalmaz. Belirli bir dizine kopyalanmasına ihtiyacınız varsa, iki parametreli DeploymentItem (source, outputDir) sürümünü kullanın. Bilginize - Testlerinizden birine bir System.Console.WriteLine (System.Environment.CurrentDirectory) bırakarak MsTest için dosyaların nerede çalıştırıldığını öğrenmek için eski moda gidebilirsiniz. NCrunch'ta bu sorun yoktu!
CodeMonkeyKing

Yanıtlar:


112

DeploymentItem biraz dağınık.

Çözümünüzdeki her dosyanın VS.NET'te "Çıktı Klasörüne Kopyala" ayarı olacaktır. Dosyaları çıktı klasörüne almak için bunun "Her Zaman Kopyala" (veya benzeri) olması gerekir.

Yeni dosyalar için bu sete sahip olup olmadığınızı kontrol edin. Bu sete sahip değilseniz, dosyalar çıktı klasörüne kopyalanmayacak ve ardından çıktı klasöründen MSTest'in iş yaptığı klasöre dağıtılamayacak.

Şahsen, birim testlerim için ihtiyaç duyduğum dosyalarım varsa, bu dosyaları bir derlemeye kaynak olarak yerleştirmenin ve testler sırasında bu derlemenin kendisini "paketinden çıkarmasının" işleri yapmanın daha öngörülebilir bir yolu olduğunu gördüm. YMMV.

not: Bu yorumlar VS2010 deneyimime dayanmaktadır. Cevabıma yapılacak yorumlar, bunun VS2012 ile ilgili bir sorun olmadığını gösteriyor. Gömülü kaynakları kullanmanın daha az "sihir" içerdiği ve benim için birim testlerimin "düzenleme" aşamasını çok daha açık hale getirdiği yorumlarının arkasındayım.


3
Çıktı Dizinine Kopyala, MSTest'in dosyaları dağıtma şeklini hiçbir zaman etkilemez. Bu cevap yanlış.
kzu

20
VS2010 Premium'da, bu değişikliğin yapılması (başka bir değişiklik yapılmaması) dosyanın konuşlandırılmasına neden oldu. Bu nedenle, MsTest dağıtımını ETKİLEDİĞİ gerçek kanıtlara dayanarak sonuca vardım.
JonStonecash

1
Kabul. Bu tek değişikliğin DeploymentItem'i ters çevirdiğini gördüm.
Martin Peck

2
Bu artık VS2012'de gerekli görünmüyor. Dağıtım öğelerim, "Çıktı Klasörüne Kopyala" "Kopyalama" olarak ayarlanmış şekilde konuşlandırılıyor.
Mike

32
DeploymentItem'in, sağladığınız tek dosyayı kopyalayamadığında size haber vermemesi harika.

75

VS2010'da, Local.testsettings'imde "Dağıtımı Etkinleştir" işareti kaldırılmıştı ve DeploymentItem özniteliği çalışmıyordu. Kontrol ettim ve her şey yolunda gitti. Umarım bu yardımcı olur!


2
Uzun zamandır kafamı bir tuğla duvara vurup onu çalıştırmaya çalışıyorum .... teşekkür ederim!
mat-mcloughlin

12
Çerçevenin, bu ayar kapatılırsa DeploymentItem özniteliklerinin yok sayılacağına dair bir uyarı yayınlamasının iyi olacağını düşünüyorum. Ayrıca masama güzel bir içbükey izlenim bıraktım.
Alan McBee - MSFT

2
Local.testsettings'in Çözüm Öğelerinde olduğunu unutmayın
Matthew Lock

Ayrıca Local.testsettings'e dağıtmak istediğim öğeleri içeren dizini de eklemem
Matthew Lock

VS2017'yi 2018'de kullanmak, 'Dağıtımı Etkinleştir'i kontrol etmek, hala bu sorunun çözümüdür. Ve ne yazık ki hala Visual Studio'dan uyarı alıyorum. Bu çözüm için teşekkürler.
Don H

19

Ben de benzer sorunlarla karşılaştım ancak bunun için 3 adımlı kolay çözüm buldum:

Klasör yapınızın aşağıdaki gibi göründüğünü varsayarsak: SolutionFolder\ TestProjectFolder\ SubFolder\

  1. "Çözüm Öğeleri / Local.testsettings"> "Dağıtım"> "Dağıtımı Etkinleştir" seçeneğini işaretleyin
  2. VS2010 kullanıyorsanız, dağıtmak istediğiniz dosyaların "Çıktı Klasörüne Kopyala" özelliğinin "Her Zaman Kopyala" veya "Daha Yeniyse Kopyala" olarak ayarlandığından emin olun.
  3. TestMethodunuzu şunlardan biriyle ilişkilendirin:
    • [DeploymentItem(@"TestProjectFolder\SubFolder")] tüm içeriğini dağıtmak <SubFolder> Test Çalıştırma dizinine için
    • [DeploymentItem(@"TestProjectFolder\SubFolder", "TargetFolder")]Test Çalıştırma dizinindeki tüm içeriğini dağıtmak <SubFolder>için<TargetFolder>

MSTest hakkında son bir not (en azından VS2010 için):

Eğer <TargetFolder>aynı isme sahip olmak istiyorsanız, MSTest koşucusu aptalca bir duruma çarptığı için <SubFolder>kullanmak [DeploymentItem(@"SubFolder", @"SubFolder")]sessizce başarısız olacaktır. Bu nedenle <SubFolder>, 'nin önüne <TestProjectFolder>şu şekilde eklemelisiniz :[DeploymentItem(@"TestProjectFolder\SubFolder", @"SubFolder")]


Alt Klasör adlandırma hatasıyla ilgili not bir cevherdir.
RJ Lohan

1
VS 2015 biraz farklı görünüyor. DeploymentItem Özniteliğindeki "TestPojectFolder" bölümünü kaldırmam gerekiyordu.
uli78

15

Umarım başkasına yardım etmek için: Tüm önerileri burada denedim ve hala dağıtım öğem kopyalanmıyordu.

Yapmam gereken ( burada önerildiği gibi ) DeploymentItem özniteliğine ikinci bir parametre eklemekti:

[DeploymentItem(@"UnitTestData\TestData.xml", "UnitTestData")]

10

.Testrunconfig dosyanıza girerseniz ve dağıtım altında "Dağıtımı Etkinleştir" seçeneğinin işaretini kaldırırsanız, testler normal konumlarında çalışır ve her şey uygulamayı bir birim testinin dışında çalıştırırken olduğu gibi çalışır.


Bununla ilgili bazı sorunlar da vardı. PM olarak, dev tarafından kullanılan tüm araçlara erişimim yok. Bu durumda ReSharper dosyayı doğru bir şekilde kopyaladı, ancak MSTest bunu yapamadı. -> dev tamamken hatalarla karşılaştım. Söz konusu dosya dahil olmak üzere 'Test-> Test Ayarlarını Düzenle -> Yerel ayarlar -> Dağıtım' olarak değiştirin, bunu MSTest kullanımım için düzeltti.
sonstabo

9

Bu muhtemelen tam sorununuzla ilgili değildir, ancak burada [DeploymentItem] özniteliğiyle bulduğum birkaç ipucu.

  1. Çıktı dizinine kopyala Her Zaman Kopyala olarak ayarlanmalıdır.

Bu mu DEĞİL [TestInitialize] özniteliği ile kullanıldığında işe

[TestInitialize]
[DeploymentItem("test.xlsx")]
public void Setup()
{

[TestMethod] 'unuzda olmalıdır, ör.

    [TestInitialize]
    public void Setup()
    {
        string spreadsheet = Path.GetFullPath("test.xlsx");
        Assert.IsTrue(File.Exists(spreadsheet));
        ...
    }

    [TestMethod]
    [DeploymentItem("test.xlsx")]
    public void ExcelQuestionParser_Reads_XmlElements()
    {
        ...
    }

1
Bu delice sinir bozucu bir sınırlamadır. Çoğu durumda, dağıtım zamanının Initialize'da olması gerektiğini düşünüyorum. Ya tüm testlerim aynı destekleyici yapıları kullanırsa? Sanırım dekoratörleri düzinelerce test yönteminden kopyalayıp yapıştırmam gerekiyor? Saçma.
Ryanman

5

Burada listelenen diğer tüm önerileri denedikten sonra hala neler olduğunu anlayamadım. Sonunda Test / Test Ayarları menüsü altında hiçbir ayar dosyası seçilmediğini keşfettim, bu da Dağıtımın etkinleştirilmediği anlamına geliyordu. Test / Test Ayarları / Test Ayarları Dosyasını Seç menü öğesini tıkladım, Local.TestSettings dosyasını seçtim, sonra her şey çalıştı.


4

Bunun soruyu tam olarak yanıtlayıp yanıtlamadığından emin değilim, ancak bazılarına yardımcı olabilir. İlk olarak, dağıtımın çalışması için "Dağıtımı Etkinleştir" kutusunun işaretlenmesi gerektiğini buldum. İkinci olarak, belge kaynak yolunun "proje yoluna göre" olduğunu söylüyor ki bu ilk başta proje klasörünü kastetmiştim. Aslında, yapı çıktı klasörüne gönderme yapıyor gibi görünüyor. Dolayısıyla, 'TestFiles' adlı bir proje klasörüm varsa ve içinde bir dosya varsa Testdata.xml, özniteliği bu şekilde kullanmak işe yaramaz:

[DeploymentItem(@"TestFiles\Testdata.xml")] 

Testdata.xmlDosyayı işaretleyebilirim Copy Always, böylece yapı çıktı klasörünün altına bir kopya koyar (örneğin, Debug\TestFiles\TestData.xml). Dağıtım mekanizması daha sonra bu yolda ( TestFiles\Testdata.xml) bulunan dosyanın kopyasını derleme çıktısına göre bulur . Ya da özelliği şu şekilde ayarlayabilirim:

[DeploymentItem(@"..\\..\TestFiles\Testdata.xml")] 

ve dağıtım mekanizması orijinal dosyayı bulacaktır. Yani her ikisi de işe yarıyor, ancak Copy Alwaysbir projede app.config dosyasını düzenlerken karşılaştığım aynı sorunu ara sıra kullandığımı fark ettim - kodu değiştirmezsem veya yeniden oluşturmaya zorlamazsam, hiçbir şey olarak işaretlenen dosyaların kopyalanmasını tetiklemez yapıya kopyalanabilir.


Göreceli yol benim için sorun oldu ve bu onu düzeltti. Testlerin nasıl çalıştırıldığına bağlı olarak 2 set DeploymentItem deyimi ekledim.
Ed Bayiates

3

Önce Dağıtım bayrağını devre dışı bıraktım. Ancak onu etkinleştirdikten sonra bile, bilinmeyen bir nedenden dolayı hedef DLL'ler bile kopyalanmayacaktı. Yanlışlıkla Test Çalıştır penceresini açtım ve önceki tüm çalışmaları öldürdüm ve sihirli bir şekilde bir sonraki çalıştırmada test klasöründe ihtiyacım olan tüm DLL'leri ve dosyaları buldum ... Çok kafa karıştırıcı.


2

Dosyaları dağıtmaya çalışırken büyük sorunlar yaşıyordum - yukarıdaki tüm önerileri denerken.

Sonra VS2010'u kapattım; yeniden başlattı, çözümü yükledi ve her şey çalıştı. (!)

Biraz kontrol ettim; Local.TestSetting'de 'Dağıtımı etkinleştir' bayrağını ayarladıktan sonra, testi Test Sonuçları penceresinden yeniden çalıştırmamalısınız. Örneğin, farklı bir test çalıştırarak veya çözümünüzü yeniden açarak önceki test çalıştırmasının kullanıcı arayüzünden kaldırılmasını sağlamalısınız.


2

Kullanma DeploymentItem .

Doğru şekilde ayarlamak çok zor ve Visual Studio 2017'de ReSharper test çalıştırıcımla veya MSTEST için yerel olanla çalışmıyordu.

Bunun yerine, veri dosyanızı sağ tıklayın ve özellikleri seçin . Çıktı dizinine kopyala'yı seçin : Her zaman .

Şimdi testinizde bunu yapın. Dizin, test projesine göre dosyanın dizinidir. Kolay.

    [TestMethod()]
    public void ParseProductsTest()
    {
        // Arrange
        var file = @"Features\Products\Files\Workbook_2017.xlsx";
        var fileStream = File.Open(file, FileMode.Open);
        // etc.
    }

Bu, otomatikleştirilmiş derleme ve test sistemlerinde iyi çalışıyor gibi görünüyor.


1

DeploymentItem özniteliğini her zaman karışık bulduğum için, bu tür dosyaların dağıtımını derleme sonrası komut dosyasını kullanarak yapıyorum. - Kopyalamak istediğiniz dosyaların Her Zaman Kopyala özelliğinin ayarlanmış olduğundan emin olun. - Dosyaları yapı hedef klasöründen (Bin \ Debug) testinizin beklediği konuma kopyalamak için test projesi oluşturma sonrası komut dosyanızı değiştirin.


1

Bunu VS2010 için deneyin. Böylece her tif için DeployItems eklemenize gerek yoktur
.

[DeploymentItem(@"files\valid\valid_entries.txt")]  
[DeploymentItem(@"files\tif\")]  

Bir test yapılandırması ekleyin.
- çözüm gezgininde çözüm düğümüne sağ tıklayın
- Ekle -> Yeni Öğe ...
- Solda Test Ayarları düğümünü seçin, sağdaki öğeyi seçin
- Ekle'ye tıklayın

Örneğin deyin TDD

> TDDAltında seçin .TestMenuEdit Testsettings

Dağıtıma tıklayın. Etkinleştirin ve ardından istediğiniz dosya ve dizinleri ekleyin. Çözüme göre bir yol olacaktır. Dosyalar yüklenecek. Orijinal dosya örneğin burada:

D:\Users\Patrik\Documents\Visual Studio 2010\Projects\DCArrDate\WebMVCDCArrDate\Trunk\WebMVCDCArrDate\Authority.xml  

Birim testimi çalıştırdığımda, şuraya kopyalanır:

D:\Users\Patrik\Documents\Visual Studio 2010\Projects\DCArrDate\WebMVCDCArrDate\Trunk\WebMVCDCArrDate.Tests\bin\Debug\TestResults\Patrik_HERKULES 2011-12-17 18_03_27\Authority.xml  

test kodunda bunu şuradan arıyorum:

[TestMethod()]
public void Read_AuthorityFiles_And_ParseXML_To_Make_Dictonary()  
{  
  string authorityFile = "Authority.xml";  
  var Xmldoc = XDocument.Load(authorityFile);  

Her Zaman Kopyala'yı seçmenize gerek yoktur; dosyaları test projesine koyun; test koduna sabit kodlanmış yollar ekleyin. Benim için bu çözüm en iyisi oldu. DeploymentItem ile denedim, her zaman kopyaladım ama hoşuma gitmedi.


1

DeploymentItem'in karmaşasından kaçınmayı tercih edenler ve @Martin Peck tarafından önerilen yaklaşımı (kabul edilen cevap) benimsemeyi tercih edenler için, gömülü kaynağın içeriğine erişmek için aşağıdaki kodu kullanabilirsiniz:

public string GetEmbeddedResource(string fullyQulifiedResourceName)
{
    var assembly = Assembly.GetExecutingAssembly();
    // NOTE resourceName is of the format "Namespace.Class.File.extension";

    using (Stream stream = assembly.GetManifestResourceStream(fullyQulifiedResourceName))
    using (StreamReader reader = new StreamReader(stream))
    {
        string result = reader.ReadToEnd();
    }
}

Ayrıntılar için bu SO Başlığına bakın


1
Derleme sunucusunda çalışırken Assembly.GetExecutingAssembly () ile sorunlar yaşadım -> gerçek test derlemesi yerine test çalıştırıcısını döndürürdü. Montajı test montajında ​​sabit bir tipten yansıtarak elde etmek (örneğin test sınıfınız) bunu benim için çözdü.
Arno Peters

1

Benim için temel neden tamamen başka bir şeydi: Testlerimin uyguladığı üretim kodu, dağıtılan .xml test dosyasını yeniden adlandırmak ve / veya silmekti.

Bu nedenle, testlerimi tek tek çalıştırdığımda başarılı oldular, ancak hepsini birlikte çalıştırdığımda, 2. ve sonraki test "dosya bulunamadı" hatalarıyla (başlangıçta yanlış tanı koyduğum DeploymentItem öznitelik çalışmıyor ).

Çözümüm, her bir test yönteminin dağıtılan dosyanın bir kopyasını oluşturması ( bu tekniği kullanarak ) ve ardından test edilen üretim kodunun orijinal yerine kopyalanan dosyayı kullanmasını sağlamaktı.


1

Yerel unittest çalıştırmasında ve teamcity unittest tekrarında bunu çözmek için Deployment items problemiyle çok zaman harcadık. Bu kolay değil.

Bu sorunu gidermek için çok iyi bir araç ProcessExplorer'dır . İşlem gezginini kullanarak, Visual Studio'nun dağıtım öğelerini nerede aradığını kontrol edebilir ve projede düzeltmeyi yapabilirsiniz. Yolun dağıtım öğesi dosya adınızı içerdiği tüm dosya işlemlerini filtreleyin ve göreceksiniz.


Bunun çok eski bir cevap olduğunu biliyorum, ancak ProcessExplorer'ı nasıl kullandığınızı detaylandırabilirseniz, bu yardımcı olacaktır. Dosya işlemlerini nasıl görüntüleyeceğimi hiç görmüyorum, onları filtrelemekten çok daha az ...
David

1

Kontrol edilmesi gereken Deployment özniteliğinin yanı sıra, DeploymentItem özniteliğiyle ilgili başka bir şey keşfettim.

[TestMethod()]
[DeploymentItem("folder\subfolder\deploymentFile.txt")]
public void TestMethod1()
{
   ...
}

DeploymentFile.txt dosyanızın testfile.cs ile değil çözüm dosyasına göre olması gerekir.

görüntü açıklamasını buraya girin


Sonunda DeploymentItem kaynağımın test projesine göre olmasını sağlayarak bu çalışmayı başardım. Bu yüzden çözümümde "Service.Tests" adlı bir projem var. Orada, kopyalamak istediğim dosyaların bulunduğu "FilesForTests" klasörüm var. Kullandım [DeploymentItem(@"FilesForTests\MyFile.txt", "FilesForTests")]. Ben düşünüyorum aynı şeyi söylüyorsunuz?
David

1

VS2013'te bunun üzerinde çalışıyorum. Bunun işe yaraması için bulgularım:

  • Çıktı dizinine kopyala, Daha Yeni / Her Zaman Kopyala: ZORUNLU ise Kopyala olarak ayarlanmalıdır.
  • .TestSettings'de "Dağıtımı Etkinleştir": GEREKLİ DEĞİLDİR. Bunu bir .TestSettings dosyası olmadan çalıştırdım.
  • Bir klasörü 2. parametre olarak belirleme: OPSİYONEL. Çıktı klasörü düzenini şekillendirir, olmadan iyi çalışır.
  • Dosya adındaki BOŞLUKLAR: bu başımı ağrıttı - dosya hiçbir zaman kopyalanmadı. Boşlukların kaldırılması bunu düzeltti. Henüz kaçış karakterlerine bakmadım.

Zor yoldan da öğrendiğim bir ipucu: bu özelliği her bir teste eklemeyi unutmayın. Dosya, test çalışmasındaki ilk atıfta bulunulan testte kopyalanır, ancak testlerin sırası değiştiğinde ve atfedilmemiş testler önce dosyayı bulmaya çalıştığında eksik kaldı.


Sonuncusu olan cevabınıza gelmeden önce burada her şeyi denedim. Suçlu: DOSYA ADINDAKİ BOŞLUKLAR! İyi belirtme çizgisi.
joelmdev

1
Visual Studio 2019 kullanarak. "Daha yeniyse kopyala" sorunu düzeltti. "Her zaman kopyala" dan nefret ediyorum çünkü projeyi hata ayıklama veya artımlı derleme gibi birçok senaryo üzerinde yeniden oluşturmaya zorluyor.
Gerardo Grignoli

Kabul. Cevabımı Yeniyse Kopyala'yı içerecek şekilde güncelledim.
Arno Peters

0

Benim büyük "yakaladım", DeploymentItem'in dizinleri işleme biçimiydi. Ben dağıtılmasını istediğim alt dizinleri içeren dizin yolu olarak iki parametreli sürümü kullanıyordum. Başlangıçta, tüm özyinelemeli klasör yapısını değil, yalnızca dizinin KÖKÜ'ndeki şeyleri kopyaladığını fark etmemiştim!

Temelde [DeploymentItem (@ "Foo \", @ "Foo \")] vardı ve Foo \ Bar'ımı dağıtmasını bekliyordum. Bunu özellikle [DeploymentItem (@ "Foo \ Bar \", @ "Foo \ Bar \")] olarak değiştirmem gerekiyordu ve şimdi bir cazibe gibi çalışıyor.


0

Ben de benzer sorunlarla karşılaştım. Yukarıda belirtilen tüm adımlara sahibim ama yine de şansım yok. VS2010 kullanıyorum. Sonra $ Menü> Test> Aktif Test Ayarını Seç> İzleme ve Test etkisinin seçildiğini buldum . İz ve test etkisini Yerel olarak değiştirdikten sonra çalışmaya başladı . Bu sayfa, dosyaların test sonuçları klasörüne kopyalanması hakkında çok yararlı bilgiler içeriyor, bu deneyimi de eklemek istiyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.