Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Använd klasserna Assert i Microsoft.VisualStudio.TestTools.UnitTesting namnområdet för att verifiera specifika funktioner. En testmetod använder koden i ditt program men rapporterar endast korrekthet när du inkluderar Assert instruktioner.
Översikt
MSTest tillhandahåller tre assertklasser:
| Class | Avsikt |
|---|---|
Assert |
Allmänna försäkran för värden, typer och undantag. |
StringAssert |
Strängspecifika uttryck för mönster, delsträngar och jämförelser. |
CollectionAssert |
Säkerställanden för att jämföra och verifiera samlingar. |
Important
För ny kod, använd alltid klassen Assert. Klasserna StringAssert och CollectionAssert kommer sannolikt att bli inaktuella i en framtida version. De behålls främst för bakåtkompatibilitet, men de rekommenderas inte eftersom uppdelningen av asserter på tre typer försämrar upptäckbarheten.
Alla kontrollmetoder accepterar en valfri meddelandeparameter som visas när försäkran misslyckas, vilket hjälper dig att identifiera orsaken:
Assert.AreEqual(expected, actual, "Values should match after processing");
Klassen Assert
Använd klassen Assert för att kontrollera att koden som testas fungerar som förväntat.
Vanliga assertionsmetoder
[TestMethod]
public async Task AssertExamples()
{
// Equality
Assert.AreEqual(5, calculator.Add(2, 3));
Assert.AreNotEqual(0, result);
// Reference equality
Assert.AreSame(expected, actual);
Assert.AreNotSame(obj1, obj2);
// Boolean conditions
Assert.IsTrue(result > 0);
Assert.IsFalse(string.IsNullOrEmpty(name));
// Null checks
Assert.IsNull(optionalValue);
Assert.IsNotNull(requiredValue);
// Type checks
Assert.IsInstanceOfType<IDisposable>(obj);
Assert.IsNotInstanceOfType<string>(obj);
// Exception testing (MSTest v3.8+)
Assert.ThrowsExactly<ArgumentNullException>(() => service.Process(null!));
await Assert.ThrowsExactlyAsync<InvalidOperationException>(
async () => await service.ProcessAsync());
}
Tillgängliga API:er
- Assert.AreEqual
- Assert.AreNotEqual
- Assert.AreNotSame
- Assert.AreSame
- Assert.Contains
- Assert.ContainsSingle
- Assert.DoesNotContain
- Assert.DoesNotEndWith
- Assert.DoesNotMatchRegex
- Assert.DoesNotStartWith
- Assert.Fail
- Assert.HasCount
- Assert.Inconclusive
- Assert.IsEmpty
- Assert.IsFalse
- Assert.IsGreaterThan
- Assert.IsGreaterThanOrEqualTo
- Assert.IsInRange
- Assert.IsInstanceOfType
- Assert.IsLessThan
- Assert.IsLessThanOrEqualTo
- Assert.IsNegative
- Assert.IsNotEmpty
- Assert.IsNotInstanceOfType
- Assert.IsNotNull
- Assert.IsNull
- Assert.IsPositive
- Assert.IsTrue
- Assert.MatchesRegex
- Assert.StartsWith
- Assert.Throws
- Assert.ThrowsAsync
- Assert.ThrowsExactly
- Assert.ThrowsExactlyAsync
Klassen StringAssert
StringAssert Använd klassen för att jämföra och undersöka strängar.
Varning
Klassen StringAssert kommer sannolikt att bli inaktuell i en framtida version. Den underhålls endast för bakåtkompatibilitet och rekommenderas inte för ny kod. Alla StringAssert metoder har motsvarigheter i Assert klassen, vilket ger bättre identifiering. Information om hur du migrerar befintliga användningar finns i analyserarens MSTEST0046.
Tillgängliga API:er är:
- StringAssert.Contains
- StringAssert.DoesNotMatch
- StringAssert.EndsWith
- StringAssert.Matches
- StringAssert.StartsWith
Klassen CollectionAssert
CollectionAssert Använd klassen för att jämföra samlingar av objekt eller för att verifiera tillståndet för en samling.
Varning
Klassen CollectionAssert kommer sannolikt att bli inaktuell i en framtida version. Den underhålls främst för bakåtkompatibilitet och rekommenderas inte för ny kod. När det finns en motsvarande metod på Assert (till exempel Assert.Contains, Assert.DoesNotContaineller Assert.HasCount), kan du använda Assert för bättre identifiering.
Tillgängliga API:er är:
- CollectionAssert.AllItemsAreInstancesOfType
- CollectionAssert.AllItemsAreNotNull
- CollectionAssert.AllItemsAreUnique
- CollectionAssert.AreEqual
- CollectionAssert.AreEquivalent
- CollectionAssert.AreNotEqual
- CollectionAssert.AreNotEquivalent
- CollectionAssert.Contains
- CollectionAssert.DoesNotContain
- CollectionAssert.IsNotSubsetOf
- CollectionAssert.IsSubsetOf
Skapa anpassade intyg med Assert.That
De inbyggda asserteringsmetoderna täcker inte alla scenarier. För att utöka asserteringsinfrastrukturen med egna kontroller exponerar MSTest singletonegenskapen Assert.That som en utökbarhetspunkt. Du lägger till anpassade intyg som C#-tilläggsmetoder för Assert instanstypen och anropare anropar dem med den välbekanta Assert.That.MyAssertion(...) syntaxen.
Organisera projektomfattande asserter i en dedikerad statisk klass för bättre hittbarhet. Anpassade assertions som man kommer åt via Assert.That visas tillsammans med de inbyggda metoderna i IntelliSense, så att man inte behöver hålla reda på en separat hjälptyp.
Skapa en anpassad försäkran
Lägg till en tilläggsmetod som riktar sig mot Assert typen och utlöser AssertFailedException när villkoret misslyckas:
using System;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
public static class CustomAssertExtensions
{
public static void IsPrime(this Assert assert, int value)
{
if (value < 2 || Enumerable.Range(2, (int)Math.Sqrt(value) - 1).Any(i => value % i == 0))
{
throw new AssertFailedException($"Assert.That.IsPrime failed. Value <{value}> is not a prime number.");
}
}
}
Använd ett anpassat intyg
När du har importerat namnområdet som innehåller dina tilläggsmetoder anropar du din anpassade försäkran via Assert.That:
[TestMethod]
public void Compute_ReturnsPrime()
{
int result = _calculator.NextPrime(10);
Assert.That.IsPrime(result);
}
Förlängningskrokar på StringAssert och CollectionAssert
Egenskaperna StringAssert.That och CollectionAssert.That exponerar samma singleton-mönster för bakåtkompatibilitet. För nya anpassade påståenden ska du alltid rikta dig mot Assert.That. Annars ärver hjälparna samma identifieringsproblem som de äldre klasserna, och de behöver migrering om StringAssert och CollectionAssert är inaktuella.
Assert.That egenskap kontra Assert.That(...) metod
Anmärkning
Blanda inte ihop Assert.Thatsingleton-egenskapen – som används som en utökningspunkt – med Assert.That(() => condition)metoden som lades till i MSTest 3.8. Det senare accepterar ett booleskt uttryck och skapar detaljerade felmeddelanden genom att analysera uttrycksträdet (till exempel Assert.That(() => order.Total > 0)). De två API:erna delar ett namn men har olika syften.
Metodtips
Använd specifika försäkran: Föredra
AreEqualframförIsTrue(a == b)för bättre felmeddelanden.Inkludera beskrivande meddelanden: Hjälp till att snabbt identifiera fel med tydliga försäkran.
Testa en sak i taget: Varje testmetod bör verifiera ett enda beteende.
Använda
Throws/ThrowsExactlyför undantag: I MSTest v3.8+ föredrar duAssert.Throws,Assert.ThrowsExactlyoch deras asynkrona motsvarigheter (ThrowsAsync,ThrowsExactlyAsync) framförExpectedExceptionattributet.Föredra
AssertframförStringAssert/CollectionAssert: För bättre upptäckbarhet och enhetlighet, använd klassenAssert. KlassernaStringAssertochCollectionAssertkommer sannolikt att bli inaktuella i en framtida version.Utöka
Assert.Thatför anpassade kontroller: För konsekvent identifiering lägger du till anpassade kontroller som tilläggsmetoder påAssertoch anropar dem viaAssert.That. Rikta inte in ny kod påStringAssert.ThatellerCollectionAssert.That.
Relaterade analysverktyg
Följande analysverktyg hjälper till att säkerställa korrekt användning av försäkran:
-
MSTEST0006 – Undvik
ExpectedExceptionattribut, användAssert.Throwsmetoder i stället. - MSTEST0017 – Argument för påståenden ska skickas i rätt ordning.
- MSTEST0023 – Negera inte booleska påståenden.
-
MSTEST0025 – Föredrar
Assert.Failframför alltid falska villkor. - MSTEST0026 – Argument för försäkran bör undvika villkorlig åtkomst.
- MSTEST0032 – Granska alltid sanna assert-villkor.
- MSTEST0037 – Använd rätt kontrollmetoder.
-
MSTEST0038 – Undvik
Assert.AreSamemed värdetyper. -
MSTEST0039 – Använd nyare
Assert.Throwsmetoder. - MSTEST0040 – Undvik att använda assertioner i asynkron kontext av void.
-
MSTEST0046 – Använd
Asserti stället förStringAssert. -
-
Assert.ThrowsMSTEST0051 ska innehålla en enda instruktion. -
MSTEST0053 – Undvik
Assertformatparametrar. - MSTEST0058 – Undvik asserter i fångstblock.