Używanie asercji Transact-SQL w testach jednostkowych programu SQL Server

W teście jednostkowym programu SQL Server zostanie uruchomiony skrypt testowy Transact-SQL i zwróci wynik. Czasami wyniki są zwracane jako zestaw wyników. Wyniki można zweryfikować przy użyciu warunków testowych. Możesz na przykład użyć warunku testu, aby sprawdzić, ile wierszy zostało zwróconych w określonym zestawie wyników lub sprawdzić, przez jaki czas trwało uruchomienie określonego testu. Aby uzyskać więcej informacji na temat warunków testowych, zobacz Używanie warunków testowych w testach jednostkowych programu SQL Server.

Zamiast używać warunków testowych, można również użyć asercji Transact-SQL, które są instrukcjami, THROW lub RAISERROR, w skrypcie Transact-SQL. W pewnych okolicznościach możesz użyć asercji Transact-SQL zamiast warunku testowego.

Używanie asercji Transact-SQL

Przed podjęciem decyzji o zweryfikowaniu danych przy użyciu asercji Transact-SQL lub przy użyciu warunków testowych należy wziąć pod uwagę następujące kwestie.

  • Wydajność. Szybsze jest uruchamianie asercji Transact-SQL na serwerze niż najpierw przeniesienie danych na komputer kliencki i manipulowanie nim lokalnie.

  • Znajomość języka. Możesz preferować konkretny język na podstawie bieżącej wiedzy i dlatego wybrać asercje Transact-SQL lub warunki testowe w języku C# albo Visual Basic.

  • Skomplikowana walidacja. W niektórych przypadkach można tworzyć bardziej złożone testy w języku C# lub Visual Basic i weryfikować testy na kliencie.

  • Prostota. Często łatwiej jest użyć wstępnie zdefiniowanego warunku testu niż do zapisania równoważnego skryptu w języku Transact-SQL.

  • Starsze biblioteki walidacji. Jeśli masz już kod, który przeprowadza walidację, możesz go użyć w teście jednostkowym programu SQL Server zamiast używać warunków testowych.

Oznacz metody testów jednostkowych z oczekiwanym wyjątkiem

Aby oznaczyć metodę testu jednostkowego programu SQL Server z oczekiwanymi wyjątkami, dodaj następujący atrybut:

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

Where:

  • nnnnn jest liczbą oczekiwanego komunikatu, na przykład 14025
  • x to stopień oczekiwanego wyjątku
  • y jest stanem oczekiwanego wyjątku

Wszystkie nieokreślone parametry są ignorowane. Przekaż te parametry do instrukcji RAISERROR w kodzie bazy danych. Jeśli określisz właściwość MatchFirstError = true, atrybut pasuje do dowolnego błędu SqlErrors w wyjątku. Domyślne zachowanie (MatchFirstError = true) jest zgodne tylko z pierwszym błędem, który występuje.

Aby zapoznać się z przykładem używania oczekiwanych wyjątków i negatywnego testu jednostkowego programu SQL Server, zobacz Przewodnik: tworzenie i uruchamianie testu jednostkowego programu SQL Server.

Instrukcja RAISERROR

Uwaga / Notatka

Użyj THROW zamiast RAISERROR. RAISERROR jest obecnie przestarzały.

Możesz bezpośrednio użyć asercji Transact-SQL na serwerze, korzystając z instrukcji RAISERROR w skrypcie Transact-SQL. Jego składnia to:

RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState)

where:

  • @ErrorMessage to dowolny komunikat o błędzie zdefiniowany przez użytkownika. Możesz sformatować ten ciąg komunikatu podobnie jak funkcję printf_s.
  • @ErrorSeverity jest poziomem ważności zdefiniowanym przez użytkownika z zakresu od 0 do 18.

Uwaga / Notatka

Wartości "0" i "10" dla poziomu ważności nie powodują niepowodzenia testu jednostkowego programu SQL Server. Możesz użyć dowolnej innej wartości z zakresu od 0 do 18, aby spowodować niepowodzenie testu.

@ErrorState jest dowolną liczbą całkowitą z zakresu od 1 do 127. Tej liczby całkowitej można użyć do odróżnienia wystąpień pojedynczego błędu wywoływanego w różnych lokalizacjach w kodzie.

Aby uzyskać więcej informacji, zobacz RAISERROR. Przykład użycia RAISERROR w teście jednostkowym programu SQL Server znajduje się w artykule How to: Write a SQL Server Unit Test that Runs within the Scope of a Single Transaction (Jak napisać test jednostkowy programu SQL Server uruchamiany w zakresie pojedynczej transakcji).