Delen via


Transact-SQL-asserties gebruiken in SQL Server-eenheidstests

In een SQL Server-eenheidstest wordt een Transact-SQL testscript uitgevoerd en wordt een resultaat geretourneerd. Soms worden de resultaten geretourneerd als een resultatenset. U kunt resultaten valideren met behulp van testvoorwaarden. U kunt bijvoorbeeld een testvoorwaarde gebruiken om te controleren hoeveel rijen zijn geretourneerd in een specifieke resultatenset of om te controleren hoe lang een bepaalde test duurde om uit te voeren. Zie Testvoorwaarden gebruiken in SQL Server-eenheidstests voor meer informatie over testvoorwaarden.

In plaats van testvoorwaarden te gebruiken, kunt u ook Transact-SQL asserties gebruiken. Dit zijn THROW of RAISERROR instructies in een Transact-SQL script. In bepaalde omstandigheden kunt u liever een Transact-SQL verklaring gebruiken in plaats van een testvoorwaarde.

Transact-SQL asserties gebruiken

Houd rekening met de volgende punten voordat u besluit om gegevens te valideren met behulp van Transact-SQL asserties of door testvoorwaarden te gebruiken.

  • Prestaties. Het is sneller om een Transact-SQL assertie uit te voeren op de server dan om eerst gegevens naar een clientcomputer te verplaatsen en deze lokaal te manipuleren.

  • Bekendheid met taal. U kunt de voorkeur geven aan een bepaalde taal op basis van uw huidige expertise en daarom Transact-SQL asserties of C# of Visual Basic-testvoorwaarden kiezen.

  • Gecompliceerde validatie. In sommige gevallen kunt u complexere tests bouwen in C# of Visual Basic en uw tests op de client valideren.

  • Eenvoud. Het is vaak eenvoudiger om een vooraf gedefinieerde testvoorwaarde te gebruiken dan het equivalente script te schrijven in Transact-SQL.

  • Verouderde validatiebibliotheken. Als u al code hebt die validatie uitvoert, kunt u deze gebruiken in een SQL Server-eenheidstest in plaats van testvoorwaarden te gebruiken.

Unittestmethoden markeren met de verwachte uitzondering

Als u een testmethode voor SQL Server-eenheden wilt markeren met verwachte uitzonderingen, voegt u het volgende kenmerk toe:

<ExpectedSqlException(MessageNumber=nnnnn, Severity=x, MatchFirstError=false, State=y)> _
[ExpectedSqlException(MessageNumber=nnnnn, Severity=x, MatchFirstError=false, State=y)]

Where:

  • nnnnn is het nummer van het verwachte bericht, bijvoorbeeld 14025
  • x is de ernst van de verwachte uitzondering
  • y is de status van de verwachte uitzondering

Niet-opgegeven parameters worden genegeerd. U geeft deze parameters door aan de RAISERROR instructie in uw databasecode. Als u MatchFirstError = true opgeeft, komt het kenmerk overeen met een van de SqlErrors in de uitzondering. Het standaardgedrag (MatchFirstError = true) beperkt zich tot enkel de eerste fout verwerken die zich voordoet.

Zie Walkthrough: Een SQL Server-eenheidstest maken en uitvoeren voor een voorbeeld van het gebruik van verwachte uitzonderingen en een negatieve SQL Server-eenheidstest.

De INSTRUCTIE RAISERROR

Opmerking

Gebruik THROW in plaats van RAISERROR. RAISERROR is nu verouderd.

U kunt Transact-SQL asserties rechtstreeks op de server gebruiken met behulp van de RAISERROR instructie in uw Transact-SQL script. De syntaxis is:

RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState)

where:

  • @ErrorMessage is een door de gebruiker gedefinieerd foutbericht. U kunt deze berichttekenreeks opmaken die vergelijkbaar is met de printf_s functie.
  • @ErrorSeverity is een door de gebruiker gedefinieerd ernstniveau van 0 - 18.

Opmerking

De waarden '0' en '10' voor het ernstniveau zorgen er niet voor dat de SQL Server-eenheidstest mislukt. U kunt elke andere waarde in het bereik 0 - 18 gebruiken om ervoor te zorgen dat de test mislukt.

@ErrorState is een willekeurig geheel getal van 1 - 127. U kunt dit gehele getal gebruiken om onderscheid te maken tussen exemplaren van één fout die wordt gegenereerd op verschillende locaties in de code.

Zie RAISERROR voor meer informatie. Een voorbeeld van hoe RAISERROR te gebruiken in een SQL Server-unittest wordt gegeven in het artikel, Hoe: Een SQL Server-unittest schrijven die binnen de reikwijdte van een enkele transactie draait.