5

我正在使用Red Gate SQL Developer工具开发数据库。SQL Test是运行 tSQLt 测试的 SSMS 插件,缺少重命名测试类的方法。

我有一个测试叫[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';

消息 15225,级别 11,状态 1,过程 sp_rename,第 374 行在当前数据库“ApiServices”中找不到名称为“BackendLayerCustomerAdministrationTests”的项目,因为@itemtype 输入为“(null)”。

我该如何改变它?

4

4 回答 4

6

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

成功!

于 2013-12-06T22:25:31.553 回答
4

抱歉这么晚才来!我是一名从事 SQL 测试的开发人员。

我们刚刚添加了将测试类重命名为最新版本的 SQL 测试的功能。

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

现在就像右键单击测试类的上下文菜单或按F2一样简单:

在此处输入图像描述

请记住,旧版本的 tSQLt 不会出现此选项。要升级,请右键单击数据库以卸载框架,然后执行Add database...重新添加它(窗口中最右侧的按钮):

在此处输入图像描述

或者,您可以在 tSQLt 中调用一个名为 的新过程tSQLt.RenameClass,这是 SQL Test 在幕后调用的。

如果您对此有任何问题,请告诉我们!

大卫

于 2014-02-27T12:24:25.513 回答
2

你的工作流程是怎样的?如果您使用 exec tSQLt.NewTestClass 'BackendLayerCustomerAdministrationTests' 在一个脚本中对该测试类进行了所有测试,那么您只需找到并替换测试类名称即可。

例如

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

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

这将起作用,因为 EXEC tSQLt.NewTestClass 'CustomerTests' 将删除测试类中的所有对象,并且它们将在脚本的其余部分运行时重新创建。

于 2013-12-10T13:07:02.827 回答
1

最简单的可能是:

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

请参阅RenameClass 的 tSQLt 文档

自从发布此问题以来,Red-gate 似乎已将这种能力添加到 SQL 测试中,但原始 SQL 代码在某种程度上更精简和更清洁(无论您是否使用出色的 SQL 测试)

于 2015-12-09T11:37:26.200 回答