Как переименовать тестовый класс tSQLt?

Я разрабатываю базу данных, используя инструменты Red Gate SQL Developer. SQL Test, надстройка SSMS, которая запускает тесты tSQLt, не имеет способа переименовать тестовые классы.

У меня есть тест под названием [BackendLayerCustomerAdministrationTests].[test uspMaintainCustomerPermissions throws error when PermissionValue is missing or empty].

Имя так долго разрывает Deployment Manager.

2013-12-05 18:48:40 +00: 00 ОШИБКА Указанный путь, имя файла или оба слишком длинны. Полноценное имя файла должно быть менее 260 символов, а имя каталога должно быть меньше 248 символов.

В этом классе есть другие нечестные имена тестов, поэтому я хочу начать с сокращения имени класса.

Более сжатое имя класса будет CustomerTests.

sp_rename здесь не помогает.

EXECUTE sys.sp_rename
  @objname = N'BackendLayerCustomerAdministrationTests',
  @newname = N'CustomerTests';

Msg 15225, уровень 11, состояние 1, процедура sp_rename, строка 374 В текущей базе данных "ApiServices" нет элемента по имени "BackendLayerCustomerAdministrationTests", учитывая, что @itemtype был введен как "(null)".

Как его изменить?

Ответ 1

Извините, что так поздно! Я разработчик, который работает над тестом SQL.

Мы только что добавили возможность переименовать тестовые классы в последнюю версию SQL Test.

http://www.red-gate.com/products/sql-development/sql-test/

Теперь это просто, как щелчок правой кнопкой мыши по контекстному меню для тестового класса или нажатие F2:

enter image description here

Пожалуйста, имейте в виду, что этот параметр не будет отображаться для старых версий tSQLt. Чтобы обновить, щелкните правой кнопкой мыши по базе данных, чтобы удалить фрейм, затем Добавить базу данных..., чтобы повторно добавить ее (самая правая кнопка в окне):

enter image description here

В качестве альтернативы вы можете просто вызвать новую процедуру в tSQLt с именем tSQLt.RenameClass, что и вызывает SQL-код за кулисами.

Пожалуйста, сообщите нам, если у вас есть какие-либо проблемы с этим!

Дэвид

Ответ 2

tSQLt классы тестов - это схемы со специальным расширенным свойством.

Cade Roux отличное решение для переименования схем - это создать новую схему, перенести все объекты, а затем удалить старую схему.

Если бы мы сделали это, мы потеряли бы расширенное свойство.

Пусть он адаптируется для рамки tSQLt.

Как переименовать тестовый класс tSQLt

Создайте новый тестовый класс.

EXECUTE tSQLt.NewTestClass
  @ClassName = 'CustomerTests';

Вы должны увидеть старый класс и новый класс вместе в представлении tSQLt.TestClasses.

SELECT *
FROM tSQLt.TestClasses;

 Name                                      SchemaId
----------------------------------------- ----------
 SQLCop                                           7
 BackendLayerCustomerAdministrationTests         10
 CustomerTests                                   14

Cade использовал Chris Shaffer выбрать конкатенацию переменной, чтобы создать список операторов переноса и распечатать результат.

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql = @sql +
N'ALTER SCHEMA CustomerTests
TRANSFER BackendLayerCustomerAdministrationTests.' + QUOTENAME(name) + N';' +
CHAR(13) + CHAR(10)
FROM sys.objects
WHERE SCHEMA_NAME([schema_id]) = N'BackendLayerCustomerAdministrationTests';

PRINT @sql;

Уродливый, но эффективный.

Скопировать вывод и выполнить как новый запрос.

ALTER SCHEMA CustomerTests
TRANSFER BackendLayerCustomerAdministrationTests.[test uspMaintainCustomer validate merged data];
ALTER SCHEMA CustomerTests
TRANSFER BackendLayerCustomerAdministrationTests.[test uspMaintainCustomerPermissions throws error when PermissionValue is missing or empty];

Здесь я показал только два теста, но он должен работать для всех.

Теперь оставьте старый тестовый класс.

EXECUTE tSQLt.DropClass
  @ClassName = N'BackendLayerCustomerAdministrationTests';

Старый класс должен исчезнуть из представления.

SELECT *
FROM tSQLt.TestClasses;

 Name                                      SchemaId
----------------------------------------- ----------
 SQLCop                                           7
 CustomerTests                                   14

Повторите все ваши тесты, чтобы проверить, что это сработало.

EXECUTE tSQLt.RunAll;

+----------------------+                                                       
|Test Execution Summary|                                                       
+----------------------+                                                       

|No|Test Case Name                                                              |Result |
+--+----------------------------------------------------------------------------+-------+
|1|[CustomerTests].[test uspMaintainCustomer throws error on missing APIKey]   |Success|
|2|[CustomerTests].[test uspMaintainCustomerPermissions validate merged data]  |Success|
|3|[SQLCop].[test Decimal Size Problem]                                        |Success|
|4|[SQLCop].[test Procedures Named SP_]                                        |Success|
|5|[SQLCop].[test Procedures using dynamic SQL without sp_executesql]          |Success|
|6|[SQLCop].[test Procedures with @@Identity]                                  |Success|
|7|[SQLCop].[test Procedures With SET ROWCOUNT]                                |Success|
-------------------------------------------------------------------------------
Test Case Summary: 7 test case(s) executed, 7 succeeded, 0 failed, 0 errored.
-------------------------------------------------------------------------------

Успех!

Ответ 3

Каков ваш рабочий процесс? Если у вас есть все ваши тесты для этого тестового класса в одном script с exec tSQLt.NewTestClass 'BackendLayerCustomerAdministrationTests', вы можете просто найти и заменить имя testclass, и все готово.

например.

EXEC tSQLt.DropClass 'BackendLayerCustomerAdministrationTests'
GO
EXEC tSQLt.NewTestClass 'CustomerTests'
GO

CREATE PROC [CustomerTests].[test_Insert_AddsACustomer]
AS
etc, etc

Это будет работать, потому что EXEC tSQLt.NewTestClass "CustomerTests" удалит все объекты в testclass, и они будут воссозданы как остальные script.

Ответ 4

Простейшим может быть:

EXEC tSQLt.RenameClass 'old test class name', 'new test class name';

Смотрите tSQLt docs для RenameClass

Кажется, Red-gate добавили эту возможность SQL Test, поскольку этот вопрос был опубликован, но исходный код SQL как-то более компактен и чист (независимо от того, используете ли вы отличный SQL-тест)