Модульное тестирование хранимых процедур и функций в. NET Core и SQL Server - PullRequest
0 голосов
/ 11 апреля 2020

Проблема: как выполнить модульное тестирование хранимой процедуры и функции?

Я видел разные посты об этом и до сих пор не знаю, какой путь правильный.

То, что я пытался: я создал проект в Visual Studio для загрузки схемы базы данных (содержащей мою хранимую процедуру и связанную функцию). Оттуда я создаю другой проект с модульным тестом. Однако, к сожалению, я нахожу это тривиальным и немного бесполезным.

Моя хранимая процедура не имеет большого значения, но я все же хотел бы знать, есть ли способ ее модульного тестирования правильно.

Хранимая процедура :

CREATE PROCEDURE update_player 
    @Username   NVARCHAR (250),
    @Luck       INT,
    @DiceNumber INT
AS
    UPDATE [dbo].[Player]
    SET [Coins] = dbo.CalculatePlayerCoins(@Luck, @DiceNumber)
    WHERE [Username] = @Username 
 GO

Моя функция:

CREATE FUNCTION CalculatePlayerCoins 
    (@Luck INT, @DiceNumber INT)  
RETURNS INT
AS    
BEGIN  
    DECLARE @ret INT;

    SELECT 
        @ret = @Luck * @DiceNumber * (SELECT Value FROM getRandomValue)

    IF (@ret IS NULL)   
        SET @ret = 0;  

    RETURN @ret;  
END; 

getRandomValue - это представление, которое возвращает случайное значение.

Я хотел бы использовать xUnit для проверки этого, если возможный. В противном случае, если бы вы могли указать мне правильное направление, было бы здорово. Заранее спасибо!

1 Ответ

1 голос
/ 12 апреля 2020

Представления обычно основаны на таблицах, которые могут быть заполнены известными значениями для модульного тестирования. В этом случае вам необходимо временно заменить представление, которое возвращает случайные значения (предположительно, с использованием RAND() или аналогичные), заглушкой, которая возвращает известные значения для тестирования.

Ниже приведен пример использования структуры модульного тестирования tsqlt . tSQLt.Run framework pro c выполняет модульные тесты в транзакции, которая откатывается после теста. Хотя подобные модульные тесты могут выполняться для общей базы данных разработки, я рекомендую запускать модульные тесты для изолированной базы данных, чтобы не влиять на других разработчиков.

CREATE PROC dbo.test_dbo_update_player
AS

--create a stub view that returns known values for unit testing
EXEC sp_rename N'dbo.getRandomValue', 'getRandomValue_orig';
EXEC('CREATE VIEW dbo.getRandomValue AS SELECT 1 AS value;');

--create a fake table with known data for this test case
EXEC tSQLt.FakeTable 'dbo.Player';
INSERT INTO dbo.Player (UserName,Coins) Values(N'Test', 0);

EXEC dbo.update_player 
      @Username   = N'Test'
    , @Luck       = 2
    , @DiceNumber = 3;

DECLARE @actual int =(SELECT Coins FROM dbo.Player WHERE UserName = N'Test');
EXEC tSQLt.AssertEquals @expected = 6, @actual = @actual, @message = 'assert equal failed for test case';
GO

--unit test framework executes unit test in a transaction and will rollback after completion
EXEC tSQLt.Run @testName = 'dbo.test_dbo_update_player';
GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...