Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of mappen te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen om mappen te wijzigen.
Sommige tests hebben tijdens runtime extra bestanden nodig, zoals testgegevens, configuratiebestanden, gouden masters of systeemeigen afhankelijkheden. Gebruik de DeploymentItemAttribute opdracht om bestanden en mappen te declareren die beschikbaar moeten zijn naast uw testassembly wanneer elke test wordt uitgevoerd.
Overzicht
Wanneer u [DeploymentItem] toepast op een testklasse of een testmethode, kopieert MSTest de opgegeven bestanden of mappen naar de map die via TestContext.DeploymentDirectory beschikbaar wordt gesteld voordat er tests binnen dat bereik worden uitgevoerd. De implementatiemap is ook de huidige werkmap voor de test, zodat uw testcode de bestanden kan openen met de gekopieerde namen.
Het kenmerk accepteert een relatief of absoluut pad:
-
Relatieve paden worden opgelost ten opzichte van de build-uitvoermap (de map die bijvoorbeeld de testassembly
bin\Debug\net10.0\bevat). - Absolute paden worden gebruikt as-is.
Important
In MSTest 3.x worden implementatie-items per testuitvoering gekopieerd. Als u een bestand beschikbaar wilt maken tijdens de implementatie, moet het bestand al bestaan in (of gekopieerd naar) de uitvoermap van de build.
Toepassen [DeploymentItem]
Het kenmerk kan worden toegepast op een testmethode, een testklasse of beide. Meerdere instanties zijn toegestaan en kunnen worden gecombineerd:
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
Wanneer u een [DeploymentItem] testklasse toepast, moet de klasse ten minste één testmethode bevatten. Het toepassen ervan op een klasse die alleen methoden zonder AssemblyInitialize of ClassInitialize heeft, heeft geen effect. Analyzer MSTEST0035 markeert dergelijke misbruik.
Overbelasting van constructor
DeploymentItemAttribute heeft twee constructors: DeploymentItemAttribute(string path) en DeploymentItemAttribute(string path, string outputDirectory).
DeploymentItemAttribute(string path)
Kopieert het bestand of de map die met path wordt aangeduid naar de hoofdmap van de implementatiemap.
// 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)
Kopieert de items naar een submap van de implementatiemap, gegeven door 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")]
Het outputDirectory argument moet een mappad zijn. Het kan niet worden gebruikt om de naam van het bestand te wijzigen. Als u een bestand met een andere naam wilt implementeren, wijzigt u de naam ervan in de bronmap (of gebruikt u een stap na de build).
Zorg ervoor dat bronbestanden de uitvoermap van de build bereiken
Omdat relatieve paden ten opzichte van de build-uitvoermap worden geïnterpreteerd, moet het bronbestand of de bronmap daar al aanwezig zijn. Er zijn twee veelvoorkomende manieren om dit te bereiken.
Gebruik <None> of <Content> met CopyToOutputDirectory
Voeg de bestanden toe aan uw testproject en markeer ze om te kopiëren naar de build-uitvoermap:
<ItemGroup>
<None Update="TestFiles\**\*.*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
Na het bouwen wordt de map TestFiles gerepliceerd in bin\<Configuration>\<TargetFramework>\TestFiles\, en [DeploymentItem("TestFiles")] wordt correct opgelost.
Een post-builddoel gebruiken
Voor bestanden die zich buiten het testproject bevinden, kopieert u deze naar de map met builduitvoer als onderdeel van de build:
<Target Name="CopySharedAssets" AfterTargets="Build">
<Copy SourceFiles="@(SharedAsset)"
DestinationFolder="$(OutDir)SharedAssets\" />
</Target>
De implementatiemap tijdens runtime controleren
Als u het absolute pad van de implementatiemap nodig hebt — bijvoorbeeld om het door te geven aan een proces dat u start of om het te loggen voor diagnostische doeleinden — gebruikt u 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);
// ...
}
Zie TestContext voor meer informatie.
Wanneer de implementatie niet plaatsvindt
MSTest maakt standaard een implementatiemap per uitvoering en kopieert items naar de map. U kunt de implementatie in een .runsettings bestand uitschakelen, zodat tests rechtstreeks uit de uitvoermap van de build worden uitgevoerd:
<RunSettings>
<MSTest>
<DeploymentEnabled>False</DeploymentEnabled>
</MSTest>
</RunSettings>
Wanneer implementatie is uitgeschakeld, hebben de kenmerken van [DeploymentItem] geen effect en wordt de test uitgevoerd in de uitvoermap van de build zelf. Zie MSTest configureren voor meer configuratieopties.
Verouderde modus en .testsettings
Wanneer MSTest in de verouderde modus wordt uitgevoerd (er wordt een .testsettings-bestand gebruikt, of RunSettings/MSTest/ForcedLegacyMode is ingesteld op true in een .runsettings-bestand), worden relatieve paden mogelijk geïnterpreteerd ten opzichte van de hoofdmap van de oplossing in plaats van de build-uitvoermap. Vermijd de verouderde modus voor nieuwe projecten — de moderne configuratie op basis van .runsettings is de aanbevolen aanpak.
Beste praktijken
- Geef de voorkeur
CopyToOutputDirectoryaan diepe relatieve paden. Bereik geen bronmappen met..\..\stijlpaden. Ze koppelen uw tests aan een specifieke indeling van de opslagplaats. Plaats de bestanden eerst in de build-uitvoermap. - Houd implementatie-items klein. Elk item wordt gekopieerd voor elke testuitvoering; grote bestanden vertragen de testuitvoering.
- Gebruik mappen om gerelateerde assets samen te implementeren.
[DeploymentItem("TestFiles")]is eenvoudiger te onderhouden dan tientallen kenmerken per bestand. - Geef voor kleine testfixtures de voorkeur aan ingebedde resources of gegevens in het geheugen. Ingesloten resources elimineren de noodzaak van implementatie en voorkomen I/O tijdens het testen.
- Ga er niet van uit dat de werkmap de projectmap is. Tijdens de testuitvoering is de werkmap de implementatiemap, niet de testprojectmap.