我正在使用Red Gate SQL Developer工具开发数据库。 SQL Test,运行tSQLt测试的SSMS加载项,缺少重命名测试类的方法。
我有一个名为[BackendLayerCustomerAdministrationTests].[test uspMaintainCustomerPermissions throws error when PermissionValue is missing or empty]
的测试。
这个名字很长breaks Deployment Manager。
2013-12-05 18:48:40 +00:00 ERROR指定的路径,文件名或两者都太长。完全限定的文件名必须少于260个字符,目录名必须少于248个字符。
本课程中还有其他笨拙的测试名称,所以我想从缩短班级名称开始。
更简洁的班级名称是CustomerTests
。
sp_rename在这里没有帮助。
EXECUTE sys.sp_rename
@objname = N'BackendLayerCustomerAdministrationTests',
@newname = N'CustomerTests';
Msg 15225,Level 11,State 1,Procedure sp_rename,Line 374 在@itemtype输入为'(null)'的情况下,当前数据库'ApiServices'中找不到名为'BackendLayerCustomerAdministrationTests'的项目。
如何更改?
答案 0 :(得分:5)
tSQLt测试类是具有特殊扩展属性的模式。
Cade Roux对renaming schemas的出色解决方案是创建一个新架构,传输所有对象,然后删除旧架构。
如果我们在这里这样做,我们将失去扩展属性。
让我们为tSQLt框架进行调整。
创建一个新的测试类。
EXECUTE tSQLt.NewTestClass
@ClassName = 'CustomerTests';
您应该在tSQLt.TestClasses
视图中一起看到旧班级和新班级。
SELECT *
FROM tSQLt.TestClasses;
Name SchemaId
----------------------------------------- ----------
SQLCop 7
BackendLayerCustomerAdministrationTests 10
CustomerTests 14
Cade使用Chris Shaffer的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.
-------------------------------------------------------------------------------
成功!
答案 1 :(得分:4)
很抱歉这么晚才进来!我是一名正在开发SQL Test的开发人员。
我们刚刚添加了将测试类重命名为最新版SQL Test的功能。
http://www.red-gate.com/products/sql-development/sql-test/
现在只需右键单击测试类的上下文菜单,或按 F2 :
请注意,旧版本的tSQLt不会显示此选项。要升级,请右键单击数据库以卸载框架,然后执行添加数据库... 以重新添加它(窗口中最右侧的按钮):
或者,你可以在tSQLt中调用一个名为tSQLt.RenameClass
的新程序,这是SQL Test在幕后调用的。
如果您对此有任何疑问,请告诉我们!
大卫
答案 2 :(得分:2)
您的工作流程是什么样的?如果您使用exec tSQLt.NewTestClass'BackendLayerCustomerAdministrationTests'在一个脚本中拥有该测试类的所有测试,那么您只需找到并替换测试类名称即可。
e.g。
EXEC tSQLt.DropClass 'BackendLayerCustomerAdministrationTests'
GO
EXEC tSQLt.NewTestClass 'CustomerTests'
GO
CREATE PROC [CustomerTests].[test_Insert_AddsACustomer]
AS
etc, etc
这将起作用,因为EXEC tSQLt.NewTestClass'CustomerTests'将删除测试类中的所有对象,并且将在脚本的其余部分运行时重新创建它们。
答案 3 :(得分:1)
最简单的可能是:
EXEC tSQLt.RenameClass 'old test class name', 'new test class name';
似乎Red-gate已经添加了SQL测试的能力,因为这个问题已经发布,但原始的SQL代码在某种程度上更精简和更清晰(无论你是否使用优秀的SQL测试)