2013-12-06 2 views
5

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

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

Название так долго это breaks 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 Нет пункт под названием 'BackendLayerCustomerAdministrationTests' можно найти в текущей базе данных 'ApiServices', учитывая, что @itemtype был вход как '(null)'.

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

ответ

4

Извините, что пришло в это так поздно! Я разработчик, который работает над SQL Test.

Мы только что добавили возможность переименовать тестовые классы в последнюю версию 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-код за кулисами.

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

Дэвид

+0

Красивые. Спасибо, Дэвид! Никогда не поздно! –

5

Испытательные классы tSQLt представляют собой схемы со специальным расширенным свойством.

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

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

Давайте адаптируем его для рамки tSQLt.

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

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

EXECUTE tSQLt.NewTestClass 
    @ClassName = 'CustomerTests'; 

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

SELECT * 
FROM tSQLt.TestClasses; 

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

Кейд использовал select variable concatenation трюк Криса Шеффера построить список операторов передачи, и распечатать результат.

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. 
------------------------------------------------------------------------------- 

Успех!

2

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

например.

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

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

Это будет работать, потому что «CustomerTests» ехес tSQLt.NewTestClass будет отбрасывать все объекты в TestClass и они будут воссозданы как остальная часть скрипта работает.

+0

В модели базы данных Red Gate вы обычно вносите изменения в базу данных, а затем толкайте их в исходное управление. Формат записывает каждый объект в свой собственный файл в качестве оператора CREATE, сохраняет процедурные преобразования только в исключительных случаях. SQL Compare обычно может автоматически определять зависимости. Плохие вещи могут произойти с неосторожными изменениями его сгенерированных скриптов, поэтому я пытаюсь отговорить его.Вероятно, вам удастся найти и заменить исходные файлы и вернуться к базе данных с помощью SQL Compare, но это оказалось более безопасным. Каков ваш рабочий процесс? –

+0

Спасибо Iain. Не сразу становится очевидным вопрос о том, что инструменты Red Gate используются для всего модульного тестирования и рабочего процесса управления версиями. Я включил мой код tSQLt в Visual Studio. Ниже приведен пример рабочего процесса, который я использую. https://github.com/chilli-andrew/tsqlt-demo-workflow – Andrew

+0

Ваш рабочий процесс выглядит как мини-тест [SQL Test] (http://www.red-gate.com/products/sql-development/sql-test /). Спасибо, что поделились ею. Будучи студентом, я получаю все инструменты Microsoft через Dreamspark, но не могу позволить себе лицензию для инструментов Red Gate. В следующий раз, когда я буду использовать SQL Server дома, я посмотрю, что я могу с ним сделать. –

1

Простейшее вероятно:

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

Смотрите tSQLt docs for RenameClass

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

Смежные вопросы