Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Některé testy vyžadují za běhu další soubory, jako jsou testovací data, konfigurační soubory, zlaté předlohy nebo nativní závislosti. DeploymentItemAttribute Použijte k deklaraci souborů a složek, které by měly být k dispozici vedle testovacího sestavení při každém spuštění testu.
Přehled
Když použijete [DeploymentItem] u testovací třídy nebo testovací metody, MSTest před spuštěním jakéhokoli testu v daném rozsahu zkopíruje zadané soubory nebo složky do adresáře zpřístupněného prostřednictvím TestContext.DeploymentDirectory. Adresář nasazení je také aktuálním pracovním adresářem testu, takže testovací kód může soubory otevřít podle jejich zkopírovaných názvů.
Atribut přijímá relativní nebo absolutní cestu:
-
Relativní cesty jsou vyřešeny proti výstupnímu adresáři sestavení (složka, která obsahuje například
bin\Debug\net10.0\testovací sestavení). - Absolutní cesty se používají beze změny.
Important
V MSTest 3.x se položky nasazení kopírují pro každý testovací běh. Pokud chcete soubor zpřístupnit v době nasazení, musí soubor již existovat ve výstupním adresáři sestavení (nebo ho zkopírovat do).
Použít [DeploymentItem]
Atribut lze použít pro testovací metodu, třídu testu nebo obojí. Je povoleno více instancí a jejich kombinace:
using System.IO;
using Microsoft.VisualStudio.TestTools.UnitTesting;
[TestClass]
[DeploymentItem(@"TestFiles\shared-config.json")]
public class ConfigurationTests
{
[TestMethod]
[DeploymentItem(@"TestFiles\customers.csv")]
public void LoadCustomers_FromCsv_ReturnsAllRows()
{
// Both shared-config.json (from the class) and customers.csv (from
// the method) are available in the deployment directory.
Assert.IsTrue(File.Exists("shared-config.json"));
Assert.IsTrue(File.Exists("customers.csv"));
}
}
Note
Pokud použijete [DeploymentItem] testovací třídu, třída musí obsahovat aspoň jednu testovací metodu. Použití u třídy, která má pouze metody AssemblyInitialize nebo ClassInitialize, nemá žádný vliv. Analyzátor MSTEST0035 na takové nesprávné použití upozorní.
Přetížení konstruktoru
DeploymentItemAttribute má dva konstruktory: DeploymentItemAttribute(string path) a DeploymentItemAttribute(string path, string outputDirectory).
DeploymentItemAttribute(string path)
Zkopíruje soubor nebo složku identifikovanou path do kořenového adresáře nasazení.
// Copy a single file from the build output directory.
[DeploymentItem("settings.json")]
// Copy a file that lives in a subfolder of the build output directory.
// The file is copied to the root of the deployment directory (the
// "Resources" folder is not preserved).
[DeploymentItem(@"Resources\test-data.xml")]
// Copy the entire TestFiles folder (and all of its subfolders) into the
// deployment directory.
[DeploymentItem("TestFiles")]
DeploymentItemAttribute(string path, string outputDirectory)
Zkopíruje položky do podadresáře v adresáři nasazení určeného pomocí outputDirectory.
// Creates a "Data" subfolder under the deployment directory, then copies
// test-data.xml into it. The file is reached at "Data\test-data.xml".
[DeploymentItem("test-data.xml", "Data")]
// Copies the contents of the Resources folder into a "Resources"
// subfolder of the deployment directory.
[DeploymentItem("Resources", "Resources")]
Argumentem outputDirectory musí být cesta ke složce. Nedá se použít k přejmenování souboru. Pokud chcete nasadit soubor s jiným názvem, přejmenujte ho ve zdrojové složce (nebo použijte krok po sestavení).
Ujistěte se, že zdrojové soubory dosáhnou výstupního adresáře sestavení.
Protože se relativní cesty vyhodnocují vzhledem k výstupnímu adresáři sestavení, zdrojový soubor nebo složka se tam již musí nacházet. Existují dva běžné způsoby, jak toho dosáhnout.
Použijte <None> nebo <Content> s CopyToOutputDirectory
Přidejte soubory do testovacího projektu a označte je, aby se zkopírovaly do výstupního adresáře sestavení:
<ItemGroup>
<None Update="TestFiles\**\*.*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
Po sestavení se složka TestFiles replikuje do bin\<Configuration>\<TargetFramework>\TestFiles\ a [DeploymentItem("TestFiles")] se správně vyhodnotí.
Použijte cíl po sestavení
U souborů, které se nacházejí mimo testovací projekt, je zkopírujte do výstupního adresáře sestavení jako součást sestavení:
<Target Name="CopySharedAssets" AfterTargets="Build">
<Copy SourceFiles="@(SharedAsset)"
DestinationFolder="$(OutDir)SharedAssets\" />
</Target>
Zkontrolujte adresář nasazení za běhu aplikace
Pokud potřebujete absolutní cestu k adresáři nasazení – například abyste ji mohli předat procesu, který spustíte, nebo ji zaznamenat do protokolu pro diagnostické účely – použijte TestContext.DeploymentDirectory:
using System.IO;
[TestMethod]
[DeploymentItem(@"TestFiles\input.json")]
public void ProcessInput_FromDeployedFile_Succeeds()
{
string fullPath = Path.Combine(TestContext.DeploymentDirectory, "input.json");
string contents = File.ReadAllText(fullPath);
// ...
}
Další informace o TestContext najdete v části třída TestContext.
Když se nasazení nestane
Ve výchozím nastavení MSTest vytvoří samostatný adresář nasazení pro každé spuštění a zkopíruje do něj položky. Nasazení v .runsettings souboru můžete zakázat, aby testy běžely přímo z výstupního adresáře sestavení:
<RunSettings>
<MSTest>
<DeploymentEnabled>False</DeploymentEnabled>
</MSTest>
</RunSettings>
Pokud je nasazení zakázané, [DeploymentItem] atributy nemají žádný vliv a test se spustí v samotném výstupním adresáři sestavení. Další možnosti konfigurace naleznete v tématu Konfigurace MSTest.
Starší režim a .testsettings
Pokud MSTest běží ve starším režimu (je použit soubor .testsettings nebo je v souboru .runsettings možnost RunSettings/MSTest/ForcedLegacyMode nastavena na true), relativní cesty se mohou překládat vzhledem ke kořenovému adresáři řešení namísto vzhledem k výstupnímu adresáři sestavení. Vyhněte se starším režimu pro nové projekty – doporučuje se moderní .runsettingskonfigurace.
Osvědčené postupy
- Upřednostňujte
CopyToOutputDirectorypřed hlubokými relativními cestami. Nepřistupujte ke zdrojovým složkám pomocí cest ve stylu..\..\— navážou vaše testy na konkrétní strukturu repozitáře. Nejprve připravte soubory do výstupního adresáře sestavení. - Udržujte položky nasazení malé. Každá položka se zkopíruje pro každé testovací spuštění; velké soubory zpomalují provádění testů.
- Pomocí složek můžete společně nasadit související prostředky.
[DeploymentItem("TestFiles")]je snazší udržovat více než desítky atributů pro jednotlivé soubory. - Upřednostněte vložené prostředky nebo data v paměti pro malé příslušenství. Vložené prostředky eliminují potřebu nasazení a v době testování se vyhýbají vstupně-výstupním operacím.
- Nespoléhejte na pracovní adresář, který je adresářem projektu. Během provádění testu je pracovní adresář adresář nasazení, nikoli složka testovacího projektu.