私は現在、C#.netで記述された「古い」システムを保守し、いくつかの古い機能を削除し、リファクタリングを行っています。ありがとう、前の男はいくつかの単体テスト(MSTests)を書いた。私はJUnitテストには非常に満足していますが、MSTestsにはまだあまり取り組みませんでした。
テストメソッドには、テスト対象のビジネスロジックメソッドによって解析されるテキストファイルを指定するDeploymentItem
属性と、TIFの束を含むパスのみが指定された2番目のDeploymentItem
があります。デプロイする必要があるファイルも。
_[TestMethod()]
[DeploymentItem(@"files\valid\valid_entries.txt")]
[DeploymentItem(@"files\tif\")]
public void ExistsTifTest()
{
...
}
_
以前はテストは機能していましたが、\ files\tifディレクトリに含まれるTIFファイルの名前を変更する必要がありました。規則によれば、TIFファイル名は、ExistsTifTest()
メソッドでもチェックされる特定のパターンに一致する必要があります。ここで、新しい要件に合わせてファイル名を変更する必要があり、突然TIFファイルが以前のように展開されなくなりました。
誰かがこれがなぜ起こるのか、または何が原因であるのかヒントを教えてもらえますか?\files\valid \ディレクトリの「valid_entries.txt」の横に「my2ndTest.txt」という新しいテキストファイルを追加し、テストメソッドのDeploymentItem属性を追加した場合も、同じことが起こります。ファイルは展開されませんか?
Testrunconfigで展開パスを直接定義することで画像を展開しましたが、これらの問題が発生する理由や、たとえば、新しいファイル "my2ndTest.txt"が他のファイルで展開されない理由を理解したいと思います。
DeploymentItem
はちょっとした混乱です。
ソリューションの各ファイルには、VS.NETの「出力フォルダーにコピー」設定があります。ファイルを出力フォルダーに入れるには、これを「常にコピー」(または同様)にする必要があります。
新しいファイル用にこのセットがあることを確認してください。このセットがない場合、ファイルは出力フォルダーにコピーされず、出力フォルダーからMSTestが処理するフォルダーにファイルを展開できません。
個人的に、ユニットテストに必要なファイルがある場合、それらのファイルをリソースとしてアセンブリに埋め込み、テスト中にそのアセンブリ自体を「アンパック」することがより予測可能な方法であることがわかりました。 YMMV。
注:これらのコメントは、VS2010での私の経験に基づいています。私の答えへのコメントは、これがVS2012の問題ではないことを示唆しています。埋め込みリソースを使用すると「マジック」が少なくなり、ユニットテストの「アレンジ」ステージがより明確になるというコメントがまだあります。
VS2010では、Local.testsettingsの[展開を有効にする]がオフになっており、DeploymentItem属性が機能していませんでした。私はそれをチェックし、すべてがうまくいきました。これがお役に立てば幸いです!
私も同様の問題に直面しましたが、このための簡単な3ステップの解決策を見つけました:
フォルダー構造が次のようになっていると仮定します:_SolutionFolder\ TestProjectFolder\ SubFolder\
_
[DeploymentItem(@"TestProjectFolder\SubFolder")]
は、_<SubFolder>
_のすべてのコンテンツをテスト実行ディレクトリに展開します[DeploymentItem(@"TestProjectFolder\SubFolder", "TargetFolder")]
は、テスト実行ディレクトリの_<SubFolder>
_のすべての内容を_<TargetFolder>
_にデプロイしますMSTestに関する最後の注意事項(少なくともVS2010の場合):
_<TargetFolder>
_を_<SubFolder>
_と同じ名前にしたい場合、[DeploymentItem(@"SubFolder", @"SubFolder")]
を使用すると、MSTestランナーが愚かなEdgeケースにヒットするため、サイレントに失敗します。これが、_<SubFolder>
_の前に_<TestProjectFolder>
_を付ける必要がある理由です:[DeploymentItem(@"TestProjectFolder\SubFolder", @"SubFolder")]
うまくいけば他の誰かを助けるために:ここですべての提案を試みましたが、still展開アイテムがコピーされていませんでした。
私がしなければならなかったのは( ここで提案したように )、DeploymentItem属性に2番目のパラメーターを追加することでした。
[DeploymentItem(@"UnitTestData\TestData.xml", "UnitTestData")]
.testrunconfigファイルに移動し、展開中に[展開を有効にする]のチェックを外すと、テストは通常の場所で実行され、単体テストの外でアプリを実行するときと同じようにすべてが機能します。
これはおそらくあなたの正確な問題とは関係ありませんが、[DeploymentItem]属性で見つけたヒントをいくつか紹介します。
[〜#〜] not [〜#〜] [TestInitialize]属性とともに使用すると動作します
[TestInitialize]
[DeploymentItem("test.xlsx")]
public void Setup()
{
[TestMethod]にあるはずです。
[TestInitialize]
public void Setup()
{
string spreadsheet = Path.GetFullPath("test.xlsx");
Assert.IsTrue(File.Exists(spreadsheet));
...
}
[TestMethod]
[DeploymentItem("test.xlsx")]
public void ExcelQuestionParser_Reads_XmlElements()
{
...
}
ここにリストされている他の提案をすべて試しても、何が起こっているのかまだわかりませんでした。最後に、[テスト/テスト設定]メニューで設定ファイルが選択されていないことがわかりました。これは、展開が有効になっていないことを意味します。テスト/テスト設定/テスト設定ファイルの選択メニュー項目をクリックし、Local.TestSettingsファイルを選択すると、すべてが機能しました。
これが質問に正確に答えるかどうかはわかりませんが、一部の人には役立つかもしれません。まず、展開を機能させるには、[展開を有効にする]ボックスをオンにする必要があることがわかりました。第二に、ドキュメントでは、ソースパスは「プロジェクトパスに相対的」であり、最初はプロジェクトフォルダを意味するものでした。実際、ビルド出力フォルダーを参照しているようです。したがって、「TestFiles」というプロジェクトフォルダーとTestdata.xml
という名前のファイルがある場合、この方法で属性を使用しても機能しません。
[DeploymentItem(@"TestFiles\Testdata.xml")]
Testdata.xml
ファイルCopy Always
をマークして、ビルドが出力フォルダー(たとえば、Debug\TestFiles\TestData.xml
)の下にコピーを配置できるようにします。展開メカニズムは、ビルド出力に関連するそのパス(TestFiles\Testdata.xml
)にあるファイルのコピーを見つけます。または、この方法で属性を設定できます。
[DeploymentItem(@"..\\..\TestFiles\Testdata.xml")]
展開メカニズムは元のファイルを見つけます。どちらでも動作しますが、Copy Always
を使用すると、プロジェクトでapp.configファイルを編集するときと同じ問題が発生することがあります-コードを変更したり、強制的に再構築しないと、何もトリガーされませんビルド時にコピーするようマークされたファイルのコピー。
最初に展開フラグを無効にしました。しかし、有効にした後でも、何らかの未知の理由で、ターゲットDLLでさえもコピーされません。偶然、テスト実行ウィンドウを開いて以前のすべての実行を強制終了し、魔法のように次の実行時にテストフォルダーに必要なすべてのDLLとファイルを見つけました...非常に混乱しています。
上記のすべての提案を試してみて、デプロイするファイルを取得しようとして大きな問題がありました。
その後、VS2010を閉じました。再起動し、ソリューションをロードして、すべてが機能しました。 (!)
いくつか確認しました。 local.TestSettingで「展開を有効にする」フラグを設定した後、テスト結果ウィンドウからテストを単に再実行しないでください。 UIから以前のテスト実行を削除する必要があります。別のテストを実行するか、ソリューションを再度開きます。
私はVS2013でこれに取り組んできました。これを機能させるための私の発見:
また、難しい方法を学んだヒント:この属性を個々のテストに追加することを忘れないでください。ファイルはtestrunの最初の属性付きテストでコピーされますが、テストの順序が変更され、属性のないテストが最初にファイルを見つけようとしたときに欠落していました。
DeploymentItem属性は常に混乱しているため、ビルド後スクリプトを使用してこのようなファイルの展開を行います。 -コピーするファイルに[常にコピー]プロパティが設定されていることを確認します。 -ビルドターゲットフォルダー(Bin\Debug)からテストが必要な場所にファイルをコピーするように、テストプロジェクトのビルド後スクリプトを変更します。
ローカルユニットテストの実行とチームシティユニットテストの再実行でも、展開アイテムの問題を解決するために多くの時間を費やしました。それは簡単ではない。
この問題をデバッグするための非常に良いツールは ProcessExplorer です。プロセスエクスプローラーを使用して、Visual Studioが展開アイテムを検索している場所を確認し、プロジェクトを修正できます。パスにdeploymentitemファイル名が含まれるすべてのファイル操作をフィルタリングすると、それが表示されます。
DeploymentItemの混乱を避け、@ Martin Peckが提案するアプローチ(受け入れられた答え)を好む人のために、次のコードを使用して埋め込みリソースのコンテンツにアクセスできます。
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();
}
}
詳細については、「 this SO Thread 」を参照してください。
DeploymentItem
を使用しないでください。正しくセットアップするのは非常に難しく、私のReSharperテストランナーでもVisual Studio 2017のMSTESTのネイティブランナーでも動作しませんでした。
代わりに、データファイルを右クリックし、propertiesを選択します。 出力ディレクトリにコピー:常にを選択します。
テストでこれを行います。ディレクトリは、テストプロジェクトに相対的なファイルのディレクトリです。簡単です。
[TestMethod()]
public void ParseProductsTest()
{
// Arrange
var file = @"Features\Products\Files\Workbook_2017.xlsx";
var fileStream = File.Open(file, FileMode.Open);
// etc.
}
これは、自動化されたビルドおよびテストシステムでうまく機能するようです。
私にとって、根本的な原因はまったく別のものでした。テストによって実行されている製品コードは、展開されている.xmlテストファイルの名前を変更したり削除したりしていました。
したがって、テストを個別に実行すると合格しますが、一緒に実行すると、2番目以降のテストは「ファイルが見つかりません」というエラーで失敗します(元々DeploymentItem
と誤診されていました)属性が機能しない)。
私の解決策は、個々のテストメソッドにデプロイされたファイルのコピーを作成し( この手法 を使用)、テスト対象の製品コードに元のファイルではなくコピーされたファイルを使用させることでした。
VS2010でこれを試してください。したがって、tifごとにDeployItemsを追加する必要はありません
削除
[DeploymentItem(@"files\valid\valid_entries.txt")]
[DeploymentItem(@"files\tif\")]
テスト構成を追加します。
-ソリューションエクスプローラーでソリューションノードを右クリックします。
-追加->新規アイテム...
-左側の[テスト設定]ノードを選択し、右側の項目を選択します
-[追加]をクリックします
例:TDD
TDD
の下のTestMenu
を選択します>> Edit Testsettings
。
展開をクリックします。有効にしてから、必要なファイルとディレクトリを追加します。ソリューションへの相対パスがあります。ファイルが置かれます。元のファイルの例を次に示します。
D:\Users\Patrik\Documents\Visual Studio 2010\Projects\DCArrDate\WebMVCDCArrDate\Trunk\WebMVCDCArrDate\Authority.xml
ユニットテストを実行すると、ユニットテストがコピーされます
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
テストコードで私はそれをから呼び出します:
[TestMethod()]
public void Read_AuthorityFiles_And_ParseXML_To_Make_Dictonary()
{
string authorityFile = "Authority.xml";
var Xmldoc = XDocument.Load(authorityFile);
常にコピーを選択する必要はありません。ファイルをテストプロジェクトに入れます。テストコードにハードコードされたパスを追加します。私にとっては、このソリューションが最適でした。 DeploymentItemで試しました。常にコピーしますが、それは私の好みではありませんでした。
私も同様の問題に直面しています。上記のすべての手順はありますが、それでも運はありません。 VS2010を使用しています。次に、$ Menu> Test> Select Active Test Setting> Trace and Test impactが選択されていることがわかりました。トレースとテストの影響をLocalに変更した後、動作し始めました。このページには、ファイルをテスト結果フォルダーにコピーすることに関する非常に役立つ情報が含まれています。このエクスペリエンスも追加したいと思います。
私の大きな「落とし穴」は、DeploymentItemがディレクトリを処理する方法でした。展開したいサブディレクトリを含むディレクトリパスとして、2パラメータバージョンを使用していました。最初はディレクトリのROOTにあるものだけをコピーし、再帰的なフォルダ構造全体をコピーするのではないことに最初は気付きませんでした!
基本的に[DeploymentItem(@ "Foo \"、@ "Foo \")]があり、Foo\Barを展開することを期待していました。具体的には[DeploymentItem(@ "Foo\Bar \"、@ "Foo\Bar \")]に変更する必要がありましたが、今では魅力のように機能します。