Distribuera filer tillsammans med MSTest-tester

Vissa tester behöver extra filer vid körning, till exempel testdata, konfigurationsfiler, gyllene huvudservrar eller inbyggda beroenden. DeploymentItemAttribute Använd för att deklarera filer och mappar som ska vara tillgängliga bredvid testsammansättningen när varje test körs.

Översikt

När du använder [DeploymentItem] på en testklass eller en testmetod kopierar MSTest de angivna filerna eller mapparna till katalogen som anges av TestContext.DeploymentDirectory innan några tester inom det omfånget körs. Distributionskatalogen är också den aktuella arbetskatalogen för testet, så din testkod kan öppna filerna med deras kopierade namn.

Attributet accepterar en relativ eller absolut sökväg:

  • Relativa sökvägar matchas mot utdatakatalogen för bygget (mappen som innehåller testsammansättningen, till exempel bin\Debug\net10.0\).
  • Absoluta sökvägar används as-is.

Important

I MSTest 3.x kopieras distributionsobjekt per testkörning. Om du vill göra en fil tillgänglig vid distributionen måste filen redan finnas i (eller kopieras till) utdatakatalogen för bygget.

Använd [DeploymentItem]

Attributet kan tillämpas på en testmetod, en testklass eller både och. Flera instanser tillåts och kan kombineras:

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

När du tillämpar [DeploymentItem] på en testklass måste klassen innehålla minst en testmetod. Att tillämpa den på en klass som bara har AssemblyInitialize eller ClassInitialize metoder har ingen effekt. Analyzer MSTEST0035 flaggar sådant missbruk.

Överlagrade konstruktorer

DeploymentItemAttribute har två konstruktorer: DeploymentItemAttribute(string path) och DeploymentItemAttribute(string path, string outputDirectory).

DeploymentItemAttribute(string path)

Kopierar filen eller mappen som identifieras av path till roten i distributionskatalogen.

// 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)

Kopierar objekten till en underkatalog i distributionskatalogen, som anges av 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")]

Argumentet outputDirectory måste vara en mappsökväg. Det kan inte användas för att byta namn på filen. Om du vill distribuera en fil med ett annat namn byter du namn på den i källmappen (eller använder ett steg efter bygget).

Se till att källfilerna når utdatakatalogen för bygget

Eftersom relativa sökvägar matchas mot utdatakatalogen för bygget måste källfilen eller mappen redan finnas där. Det finns två vanliga sätt att uppnå detta.

Använd <None> eller <Content> med CopyToOutputDirectory

Lägg till filerna i testprojektet och markera dem som ska kopieras till utdatakatalogen för bygget:

<ItemGroup>
  <None Update="TestFiles\**\*.*">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </None>
</ItemGroup>

Efter en build replikeras mappen TestFiles i bin\<Configuration>\<TargetFramework>\TestFiles\, och [DeploymentItem("TestFiles")] tolkas korrekt.

Använd ett mål efter kompileringen

För filer som finns utanför testprojektet kopierar du dem till utdatakatalogen för bygget som en del av bygget:

<Target Name="CopySharedAssets" AfterTargets="Build">
  <Copy SourceFiles="@(SharedAsset)"
        DestinationFolder="$(OutDir)SharedAssets\" />
</Target>

Granska distributionskatalogen vid körning

Om du behöver den absoluta sökvägen för distributionskatalogen, till exempel för att skicka den till en process som du skapar eller för att logga den för diagnostik, använder du 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);
    // ...
}

Mer information om TestContext finns i klassen TestContext.

När distributionen inte sker

Som standard skapar MSTest en distributionskatalog per körning och kopierar objekt till den. Du kan inaktivera distributionen i en .runsettings fil så att testerna körs direkt från utdatakatalogen för bygget:

<RunSettings>
  <MSTest>
    <DeploymentEnabled>False</DeploymentEnabled>
  </MSTest>
</RunSettings>

När distributionen är inaktiverad [DeploymentItem] har attribut ingen effekt och testet körs i själva katalogen för byggutdata. Fler konfigurationsalternativ finns i Konfigurera MSTest.

Äldre läge och .testsettings

När MSTest körs i bakåtkompatibelt läge (en .testsettings-fil används, eller om RunSettings/MSTest/ForcedLegacyMode har värdet true i en .runsettings-fil) kan relativa sökvägar tolkas i förhållande till lösningens rotkatalog i stället för katalogen för byggutdata. Undvik äldre läge för nya projekt – den moderna .runsettingskonfigurationen är den rekommenderade metoden.

Bästa praxis

  • Föredrar CopyToOutputDirectory framför djupa relativa sökvägar. Gå inte in i källmapparna med sökvägar av typen ..\..\ – de knyter dina tester till en specifik lagringsplatsstruktur. Mellanlagra filerna i utdatakatalogen för bygget först.
  • Håll distributionsobjekten små. Varje objekt kopieras för varje testkörning. stora filer saktar ner testkörningen.
  • Använd mappar för att distribuera relaterade tillgångar tillsammans. [DeploymentItem("TestFiles")] är enklare att underhålla än dussintals attribut per fil.
  • Föredrar inbäddade resurser eller minnesintern data för små fixturer. Inbäddade resurser eliminerar behovet av distribution och undviker I/O vid testtillfället.
  • Förlita dig inte på att arbetskatalogen är projektkatalogen. Vid testkörning är arbetskatalogen distributionskatalogen, inte testprojektmappen.

Se även