tSQLt – testowanie procedur

Dzisiaj kolejny scenariusz, w którym przetestujemy procedurę zwracającą dane. Tak jak w poprzednim wpisie, mamy następującą tabelę

CREATE TABLE [dbo].[Articles](
	[Id] [INT] NOT NULL,
	[Title] [NCHAR](10) NULL,
	[Content] [NCHAR](500) NULL,
PRIMARY KEY CLUSTERED 
(
	[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

Załóżmy również, że mamy procedurę GetArticlesByTitle:

CREATE PROCEDURE GetArticlesByTitle
	@title NVARCHAR(10)
AS
BEGIN

	SELECT * FROM dbo.Articles WHERE Title=@Title;
END
GO

Metoda bardzo prosta, ale większość testów będzie miała taki sam szablon Zaczynamy od izolacji tabel, w tym przypadku “Articles”:

  EXEC tSQLt.FakeTable 'dbo.Articles'

Następnie musimy jakieś dane wstrzyknąć:

  INSERT INTO dbo.Articles (Title,Content) VALUES('art1','content1'),('est','content2')

W powyższym przykładzie, dane są dodawane do mock’a, a nie realnej tabeli ponieważ na początku mamy tSQLt.FakeTable.

Kolejnym etapem jest stworzenie dwóch pomocniczych tabel – ExpectedValues oraz ActualValues:

  CREATE TABLE ActualValues
  (
  		Id INTEGER,
		Title nvarchar(10),
		Content nchar(500)
  )

    CREATE TABLE ExpectedValues
  (
		Title nvarchar(10),
		Content nchar(500)
  )
  
  INSERT INTO dbo.ExpectedValues ( Title,Content) VALUES  ( 'art1','content1')

Całość testu wygląda tak:

ALTER PROCEDURE [sampleTests].[test when there is an article with the requested name it should be returned]
AS
BEGIN
  --Assemble
  EXEC tSQLt.FakeTable 'dbo.Articles'

  INSERT INTO dbo.Articles (Title,Content) VALUES('art1','content1'),('est','content2')

  CREATE TABLE ActualValues
  (
  		Id INTEGER,
		Title nvarchar(10),
		Content nchar(500)
  )

    CREATE TABLE ExpectedValues
  (
		Title nvarchar(10),
		Content nchar(500)
  )
  
  INSERT INTO dbo.ExpectedValues ( Title,Content) VALUES  ( 'art1','content1')
  --Act
 INSERT INTO ActualValues EXEC dbo.GetArticlesByTitle 'art1'
  
  --Assert
  EXEC tSQLt.AssertEqualsTable @Expected = N'ExpectedValues',  @Actual = N'ActualValues'
  
END;

Za pomocą AssertEqualsTable porównujemy, że ActualValues (wartości zwrócone z procedury) są równe naszym oczekiwaniom (ExpectedValues). Po wykonaniu testu, jeśli któraś z wartości nie jest taka sama, dostaniemy tabelkę porównującą wyniki:
1

Jak widzimy, testowanie jest dość proste. Najpierw dodajemy potrzebne dane,  a potem definiujemy nasze oczekiwania.

Leave a Reply

Your email address will not be published.