Demonstra Passo a passo: Criando e executando um teste de unidade de banco de dados
Esta explicação passo a passo, você cria um teste de unidade de banco de dados que verifica o comportamento de vários procedimentos armazenados. Você criar testes de unidade de banco de dados para ajudar a identificar defeitos de código que podem causar comportamento incorreto do aplicativo. Você pode executar testes de unidade de banco de dados e os testes de aplicativo como parte de uma automatizado suíte de testes.
Nesta explicação passo a passo, você executa as seguintes tarefas:
Criar um script que contém um esquema de banco de dados
Crie um projeto de banco de dados e importar o esquema
Implantar o projeto de banco de dados para um ambiente de desenvolvimento isolado
Criar testes de unidade de banco de dados
Definir a lógica de teste
Executar testes de unidade de banco de dados
Adicionar um teste de unidade negativo
Depois que um dos testes de unidade detecta um erro em um procedimento armazenado, você corrigir esse erro e execute novamente o teste.
Pré-requisitos
Para concluir este passo a passo, você deve ser capaz de se conectar a um servidor de banco de dados no qual você tem permissões para criar e implantar um banco de dados. Para obter mais informações, consulte Permissões necessárias para os recursos de banco de dados de Visual Studio.
Criar um Script que contém um esquema de banco de dados
Para criar um script a partir do qual você pode importar um esquema
Sobre o arquivo , aponte para novae, em seguida, clique em arquivo.
O Novo arquivo caixa de diálogo aparece.
No categorias , clique em Geral se já não estiver realçado.
No modelos de lista, clique em Arquivo Sqle, em seguida, clique em Abrir.
O Transact-SQL editor será aberta.
Copie o seguinte Transact-SQL code e colá-lo para o Transact-SQL editor.
PRINT N'Creating Sales...'; GO CREATE SCHEMA [Sales] AUTHORIZATION [dbo]; GO PRINT N'Creating Sales.Customer...'; GO CREATE TABLE [Sales].[Customer] ( [CustomerID] INT IDENTITY (1, 1) NOT NULL, [CustomerName] NVARCHAR (40) NOT NULL, [YTDOrders] INT NOT NULL, [YTDSales] INT NOT NULL ); GO PRINT N'Creating Sales.Orders...'; GO CREATE TABLE [Sales].[Orders] ( [CustomerID] INT NOT NULL, [OrderID] INT IDENTITY (1, 1) NOT NULL, [OrderDate] DATETIME NOT NULL, [FilledDate] DATETIME NULL, [Status] CHAR (1) NOT NULL, [Amount] INT NOT NULL ); GO PRINT N'Creating Sales.Def_Customer_YTDOrders...'; GO ALTER TABLE [Sales].[Customer] ADD CONSTRAINT [Def_Customer_YTDOrders] DEFAULT 0 FOR [YTDOrders]; GO PRINT N'Creating Sales.Def_Customer_YTDSales...'; GO ALTER TABLE [Sales].[Customer] ADD CONSTRAINT [Def_Customer_YTDSales] DEFAULT 0 FOR [YTDSales]; GO PRINT N'Creating Sales.Def_Orders_OrderDate...'; GO ALTER TABLE [Sales].[Orders] ADD CONSTRAINT [Def_Orders_OrderDate] DEFAULT GetDate() FOR [OrderDate]; GO PRINT N'Creating Sales.Def_Orders_Status...'; GO ALTER TABLE [Sales].[Orders] ADD CONSTRAINT [Def_Orders_Status] DEFAULT 'O' FOR [Status]; GO PRINT N'Creating Sales.PK_Customer_CustID...'; GO ALTER TABLE [Sales].[Customer] ADD CONSTRAINT [PK_Customer_CustID] PRIMARY KEY CLUSTERED ([CustomerID] ASC) WITH (ALLOW_PAGE_LOCKS = ON, ALLOW_ROW_LOCKS = ON, PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, STATISTICS_NORECOMPUTE = OFF); GO PRINT N'Creating Sales.PK_Orders_OrderID...'; GO ALTER TABLE [Sales].[Orders] ADD CONSTRAINT [PK_Orders_OrderID] PRIMARY KEY CLUSTERED ([OrderID] ASC) WITH (ALLOW_PAGE_LOCKS = ON, ALLOW_ROW_LOCKS = ON, PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, STATISTICS_NORECOMPUTE = OFF); GO PRINT N'Creating Sales.FK_Orders_Customer_CustID...'; GO ALTER TABLE [Sales].[Orders] ADD CONSTRAINT [FK_Orders_Customer_CustID] FOREIGN KEY ([CustomerID]) REFERENCES [Sales].[Customer] ([CustomerID]) ON DELETE NO ACTION ON UPDATE NO ACTION; GO PRINT N'Creating Sales.CK_Orders_FilledDate...'; GO ALTER TABLE [Sales].[Orders] ADD CONSTRAINT [CK_Orders_FilledDate] CHECK ((FilledDate >= OrderDate) AND (FilledDate < '01/01/2020')); GO PRINT N'Creating Sales.CK_Orders_OrderDate...'; GO ALTER TABLE [Sales].[Orders] ADD CONSTRAINT [CK_Orders_OrderDate] CHECK ((OrderDate > '01/01/2005') and (OrderDate < '01/01/2020')); GO PRINT N'Creating Sales.uspCancelOrder...'; GO CREATE PROCEDURE [Sales].[uspCancelOrder] @OrderID INT AS BEGIN DECLARE @Delta INT, @CustomerID INT BEGIN TRANSACTION SELECT @Delta = [Amount], @CustomerID = [CustomerID] FROM [Sales].[Orders] WHERE [OrderID] = @OrderID; UPDATE [Sales].[Orders] SET [Status] = 'X' WHERE [OrderID] = @OrderID; UPDATE [Sales].[Customer] SET YTDOrders = YTDOrders - @Delta WHERE [CustomerID] = @CustomerID COMMIT TRANSACTION END GO PRINT N'Creating Sales.uspFillOrder...'; GO CREATE PROCEDURE [Sales].[uspFillOrder] @OrderID INT, @FilledDate DATETIME AS BEGIN DECLARE @Delta INT, @CustomerID INT BEGIN TRANSACTION SELECT @Delta = [Amount], @CustomerID = [CustomerID] FROM [Sales].[Orders] WHERE [OrderID] = @OrderID; UPDATE [Sales].[Orders] SET [Status] = 'F', [FilledDate] = @FilledDate WHERE [OrderID] = @OrderID; UPDATE [Sales].[Customer] SET YTDSales = YTDSales - @Delta WHERE [CustomerID] = @CustomerID COMMIT TRANSACTION END GO PRINT N'Creating Sales.uspNewCustomer...'; GO CREATE PROCEDURE [Sales].[uspNewCustomer] @CustomerName NVARCHAR (40) AS BEGIN INSERT INTO [Sales].[Customer] (CustomerName) VALUES (@CustomerName); SELECT SCOPE_IDENTITY() END GO PRINT N'Creating Sales.uspPlaceNewOrder...'; GO CREATE PROCEDURE [Sales].[uspPlaceNewOrder] @CustomerID INT, @Amount INT, @OrderDate DATETIME, @Status CHAR (1)='O' AS BEGIN DECLARE @RC INT BEGIN TRANSACTION INSERT INTO [Sales].[Orders] (CustomerID, OrderDate, FilledDate, Status, Amount) VALUES (@CustomerID, @OrderDate, NULL, @Status, @Amount) SELECT @RC = SCOPE_IDENTITY(); UPDATE [Sales].[Customer] SET YTDOrders = YTDOrders + @Amount WHERE [CustomerID] = @CustomerID COMMIT TRANSACTION RETURN @RC END GO CREATE PROCEDURE [Sales].[uspShowOrderDetails] @CustomerID INT=0 AS BEGIN SELECT [C].[CustomerName], CONVERT(date, [O].[OrderDate]), CONVERT(date, [O].[FilledDate]), [O].[Status], [O].[Amount] FROM [Sales].[Customer] AS C INNER JOIN [Sales].[Orders] AS O ON [O].[CustomerID] = [C].[CustomerID] WHERE [C].[CustomerID] = @CustomerID END GO
Sobre o arquivo menu, clique em Salvar SqlQuery_1.sql como.
O Salvar arquivo como caixa de diálogo aparece.
Em nome do objeto, tipo SampleImportScript.sql.
Você pode salvar o arquivo em qualquer local no computador. Anote a localização porque você deve usar esse script no próximo procedimento.
Clique em Save.
No menu File, clique em Close Solution.
Em seguida, você cria um projeto de banco de dados e importar o esquema do script que você criou.
Crie um projeto de banco de dados e importar um esquema.
Para criar um projeto de banco de dados
Sobre o arquivo , aponte para novae clique em projeto.
A caixa de diálogo New Project será exibida.
Em Modelos instalados, expanda o banco de dados nó e depois clique em SQL Server.
Observação Se você estiver usando Visual Studio Professional, em vez disso, procure Installed Templates, expanda o banco de dados nó, expanda o SQL Server nó e clique Advanced.
Na lista de modelos, clique em Projeto de banco de dados de 2008 do SQL Server.
Observação Se você planeja implantar o seu banco de dados para uma versão diferente do banco de dados, em vez disso, escolha o modelo que corresponde ao seu servidor de destino.
Em nome, digite SimpleUnitTestDB.
Selecione o Create directory for solution caixa de seleção se não estiver selecionada.
Limpar o Add to Source Control caixa de seleção se ele já não estiver desmarcada e clique em OK.
O projeto de banco de dados é criado e aparece na Solution Explorer. Em seguida você importar o esquema de banco de dados de um script.
Para importar um esquema de banco de dados de um script
Sobre o projeto menu, clique em Importar Script.
Clique em próximo depois de ler a página de boas-vindas.
Clique em Procurare indicar o caminho onde você salvou o arquivo SampleImportScript.sql.
Clique duas vezes no arquivo SampleImportScript.sql e, em seguida, clique em Concluir.
O script é importado, e os objetos que são definidos no script são adicionados ao seu projeto de banco de dados.
Revise o resumo e, em seguida, clique em Concluir para concluir a operação.
Observação O procedimento Sales.uspFillOrder contém um erro intencional de codificação que você irá detectar e corrigir neste procedimento.
Para examinar o projeto resultante
Em Solution Explorer, expanda o Os objetos de esquema nó filho.
Explore os subnós sob o Os objetos de esquema o nó na hierarquia.
Solution Explorer contém os arquivos que definem os objetos de banco de dados.
Do Exibir menu, clique em o modo de exibição do esquema de banco de dados.
Em Visualização Esquema, expanda o nó de SimpleUnitTestDB.
Explore os subnós sob o nó de SimpleUnitTestDB na hierarquia.
Modo de exibição do esquema contém os objetos que são definidos nos arquivos que aparecem no Solution Explorer.
Implantando em um ambiente de desenvolvimento isolado
Em seguida você implantar o projeto para criar um banco de dados que tem o esquema importado, mas nenhum dado. Criar o banco de dados em um o ambiente de desenvolvimento isolado (ou seguro) para que você pode desenvolver e testar o banco de dados sem interferência de outros esforços.
Para configurar e construir o projeto de banco de dados
Em Solution Explorer, clique no projeto de banco de dados SimpleUnitTestDB.
Sobre o projeto menu, clique em Propriedades de SimpleUnitTestDB.
Aparece a caixa de diálogo Propriedades do projeto.
Clique o Deploy guia.
No definir configurações de implantação para , clique em Meu ambiente de desenvolvimento isolado. Definindo configurações de seu ambiente de desenvolvimento isolado, você pode usar as configurações de implantação diferentes daqueles que serão usados em outros ambientes, como, por exemplo, o servidor de teste ou produção.
No A ação implantar , clique em criar um script de implantação (. SQL) e implantar banco de dados.
Em Configurações de banco de dados de destino, clique em Editar.
O Propriedades de conexão caixa de diálogo aparece.
Defina as propriedades de conexão do banco de dados que você deseja criar e clique em OK.
No Conexão de destino caixa, a seqüência de caracteres de conexão correta é exibida.
Aviso
Você deve criar o banco de dados em um servidor de teste, um servidor de desenvolvimento ou no computador local. Você não deve especificar o servidor de produção.
Em nome do banco de dados de destino, digite SimpleUnitTestDB.
Ao lado de arquivo de configuração de implantação, clique em Editar.
Limpar o implantação incremental do bloco se poderá ocorrer perda de dados caixa de seleção.
Observação Para esta explicação, você testará os procedimentos armazenados em um banco de dados vazio, o que você implantar como parte do teste de unidade de banco de dados. Não é necessário que preservar os dados existentes, pois você irá testar os procedimentos armazenados no seu ambiente de desenvolvimento isolado.
No menu File, clique em Save All.
Sobre o Build menu, clique em Build Solution.
As propriedades que você acabou de definir determinam como o script de implantação é criado. O status da compilação aparece no saída janela, e Build: 1 com êxito ou atualizada deve aparecer como a última linha.
Observação Se o saída janela não for exibida, abra o Exibir menu e clique saída.
Para implantar o projeto de banco de dados
Em Solution Explorer, clique no projeto de banco de dados SimpleUnitTestDB.
Sobre o Build menu, clique em Implantar SimpleUnitTestDB.
Aviso
Você deve executar essa implantação contra um servidor de teste, um servidor de desenvolvimento ou computador local. Você não deve especificar o servidor de produção.
O projeto de banco de dados é implantado para um novo banco de dados. O status da implantação aparece no saída janela, e Deploy: 1 foi bem-sucedida deve aparecer como a última linha. Você pode definir um o plano de geração de dados para criar dados de teste em seu banco de dados. Para esta explicação passo a passo, você está testando um banco de dados muito simple para os quais você precisa gerar dados.
Criar testes de unidade de banco de dados
Para criar um banco de dados teste de unidade para os procedimentos armazenados
Sobre o Exibir menu, clique em Visualização do esquema de banco de dados.
No Visualização Esquema, expandir o esquemas nó, expanda o vendas nó, expanda o programação nó e expanda o Stored Procedures nó.
Com o botão direito do uspNewCustomer procedimento armazenado e clique em Create Unit Tests.
A caixa de diálogo Create Unit Tests aparece.
Marque as caixas de seleção para todos os procedimentos armazenados de cinco: Sales.uspCancelOrder, Sales.uspFillOrder, Sales.uspNewCustomer, Sales.uspPlaceNewOrder, e Sales.uspShowOrderDetails.
Em projeto, clique em criar um novo projeto teste Visual C#.
Aceitar os nomes padrão para o nome do projeto e o nome da classe e, em seguida, clique em OK.
O o projeto 'testproject1' Configuração caixa de diálogo aparece.
Em executar testes de unidade usando a seguinte conexão de dados, especifique uma conexão de banco de dados que você tiver implantado anteriormente.
Observação Se você deve testar os modos de exibição ou procedimentos armazenados que têm permissões restritas, você especificaria normalmente essa conexão nesta etapa. Em seguida, especifique a conexão secundária, com permissões mais amplas, para validar o teste. Se você tiver uma conexão secundária, adicione esse usuário para o projeto de banco de dados e criar um logon desse usuário no script de pré-implantação.
Em implantação, selecione o implantar automaticamente o projeto de banco de dados são executados testes de unidade antes de caixa de seleção.
Em o projeto de banco de dados, clique em SimpleUnitTestDB.dbproj.
Na a configuração de implantação, clique em Debug.
Você também pode gerar dados de teste como parte dos testes de unidade de banco de dados. Para esta explicação, poderá pular essa etapa porque os testes irá criar seus próprios dados.
Clique em OK.
O projeto de teste é compilado e o criador de teste de unidade de banco de dados é exibida. Em seguida, você irá atualizar a lógica de teste no Transact-SQL o script de testes de unidade.
Definir a lógica de teste
Este banco de dados muito simple possui duas tabelas, o cliente e pedido. Para atualizar o banco de dados usando os seguintes procedimentos armazenados:
uspNewCustomer - isso armazenado procedimento adiciona um registro à tabela Customer, que define as colunas de YTDOrders e YTDSales do cliente como zero.
uspPlaceNewOrder - isso armazenado procedimento adiciona um registro na tabela de pedidos do cliente especificado e atualiza o valor de YTDOrders do registro correspondente na tabela de clientes.
uspFillOrder - isso armazenado atualizações de procedimento, um registro dos pedidos da tabela, alterando o status de ' o ' a 'F' e os incrementos de YTDSales o valor do registro correspondente na tabela de clientes.
uspCancelOrder - isso armazenado atualizações de procedimento, um registro dos pedidos da tabela, alterando o status de ' o ' para 'X' e diminui o YTDOrders o valor do registro correspondente na tabela de clientes.
uspShowOrderDetails - isso armazenado uniões procedimento, tabela de pedidos com a tabela de personalizado e mostra os registros para um cliente específico.
Observação |
---|
Este exemplo ilustra como criar um teste de unidade de banco de dados simples. Em um banco de dados do mundo real, você pode somar os valores totais de todos os pedidos com um status de ' o ' ou 'F' para um determinado cliente. Os procedimentos neste passo a passo também não contenham nenhuma manipulação de erros. Por exemplo, eles não impedem você chamar o uspFillOrder para um pedido que já foram preenchido. |
Os testes pressupõem que o banco de dados começa em um estado limpo. Você irá criar testes que verifiquem as seguintes condições:
uspNewCustomer - Verifique se a tabela Customer contém uma linha depois de executar o procedimento armazenado.
uspPlaceNewOrder - para o cliente que tenha um CustomerID 1, coloque um pedido de r $100. Verifique se que a quantidade de YTDOrders para que o cliente é 100 e que a quantidade de YTDSales é zero.
uspFillOrder - para o cliente que tenha um CustomerID 1, faça um pedido r $50. Ordem de preenchimento. Verifique se os valores de YTDOrders e YTDSales os 50.
uspShowOrderDetails - para o cliente que possui um CustomerID de 1, pedidos de lugar de r $100,00, r $50 e r $5. Verifique se uspShowOrderDetails retorna o número de colunas correto e que o conjunto de resultados tem uma soma de verificação esperada.
Observação |
---|
Para obter um conjunto completo de testes de unidade de banco de dados, você normalmente seria verificar que as outras colunas foram definidas corretamente. Para manter este passo a passo em um tamanho gerenciável, ele não descreve como verificar o comportamento de uspCancelOrder. |
Para gravar o teste de unidade de banco de dados para uspNewCustomer
Na barra de navegação do Designer de teste de unidade de banco de dados, clique em Sales_uspNewCustomerTeste certifique-se de que teste é destacada na lista adjacente.
Depois de executar a etapa anterior, você pode criar o script de teste para a ação de teste no teste de unidade.
Atualização do Transact-SQL as instruções na Transact-SQL editor para coincidir com as instruções a seguir:
-- database unit test for Sales.uspNewCustomer DECLARE @RC AS INT, @CustomerName AS NVARCHAR (40); SELECT @RC = 0, @CustomerName = 'Fictitious Customer'; EXECUTE @RC = [Sales].[uspNewCustomer] @CustomerName; SELECT * FROM [Sales].[Customer];
No Condições de teste painel, clique na condição de teste Inconclusive e clique em Excluir condição de teste (x).
No Condições de teste painel, clique em Contagem de linhas na lista e, em seguida, clique Adicionar condição de teste (+).
No Propriedades janela, defina a Contagem de linhas propriedade como 1.
No menu File, clique em Save All.
Em seguida, você definir a lógica de teste de unidade para uspPlaceNewOrder.
Para gravar o teste de unidade de banco de dados para uspPlaceNewOrder
Na barra de navegação do Designer de teste de unidade de banco de dados, clique em Sales_uspPlaceNewOrderTeste certifique-se de que teste é destacada na lista adjacente.
Depois de executar esta etapa, você pode criar o script de teste para a ação de teste no teste de unidade.
Atualização do Transact-SQL as instruções na Transact-SQL editor para coincidir com as instruções a seguir:
-- database unit test for Sales.uspPlaceNewOrder DECLARE @RC AS INT, @CustomerID AS INT, @Amount AS INT, @OrderDate AS DATETIME, @Status AS CHAR (1); DECLARE @CustomerName AS NVARCHAR(40); SELECT @RC = 0, @CustomerID = 0, @CustomerName = N'Fictitious Customer', @Amount = 100, @OrderDate = getdate(), @Status = 'O'; -- NOTE: Assumes that you inserted a Customer record with CustomerName='Fictitious Customer' in the pre-test script. SELECT @CustomerID = [CustomerID] FROM [Sales].[Customer] WHERE [CustomerName] = @CustomerName; -- place an order for that customer EXECUTE @RC = [Sales].[uspPlaceNewOrder] @CustomerID, @Amount, @OrderDate, @Status; -- verify that the YTDOrders value is correct. SELECT @RC = [YTDOrders] FROM [Sales].[Customer] WHERE [CustomerID] = @CustomerID SELECT @RC AS RC
No Condições de teste painel, clique na condição de teste Inconclusive e clique em Excluir condição de teste (x).
No Condições de teste painel, clique em O valor de escalar na lista e, em seguida, clique Adicionar condição de teste (+).
No Propriedades janela, defina a valor esperado a propriedade como 100.
Na barra de navegação do Designer de teste de unidade de banco de dados, clique em Sales_uspPlaceNewOrderTeste certifique-se de que pré-teste é destacada na lista adjacente.
Depois de executar esta etapa, você pode especificar instruções colocar os dados do estado em que é necessário para executar o teste. Neste exemplo, você deve criar o registro do cliente antes de poder colocar um pedido.
Clique em Clique aqui para criar para criar um script pré-teste.
Atualização do Transact-SQL as instruções na Transact-SQL editor para coincidir com as instruções a seguir:
/* Add Transact-SQL statements here that you want to run before the test script is run. */ -- Add a customer for this test with the name 'Fictitious Customer' DECLARE @NewCustomerID AS INT, @CustomerID AS INT, @RC AS INT, @CustomerName AS NVARCHAR (40); SELECT @RC = 0, @NewCustomerID = 0, @CustomerID = 0, @CustomerName = N'Fictitious Customer'; IF NOT EXISTS(SELECT * FROM [Sales].[Customer] WHERE CustomerName = @CustomerName) BEGIN EXECUTE @NewCustomerID = [Sales].[uspNewCustomer] @CustomerName; END -- NOTE: Assumes that you inserted a Customer record with CustomerName='Fictitious Customer' in the pre-test script. SELECT @CustomerID = [CustomerID] FROM [Sales].[Customer] WHERE [CustomerName] = @CustomerName; -- delete any old records in the Orders table and clear out the YTD Sales/Orders fields DELETE from [Sales].[Orders] WHERE [CustomerID] = @CustomerID; UPDATE [Sales].[Customer] SET YTDOrders = 0, YTDSales = 0 WHERE [CustomerID] = @CustomerID;
No menu File, clique em Save All.
Em seguida, você criar o teste de unidade para uspFillOrder.
Para gravar o teste de unidade de banco de dados para uspFillOrder
Na barra de navegação do Designer de teste de unidade de banco de dados, clique em Sales_uspFillOrderTeste certifique-se de que teste é destacada na lista adjacente.
Depois de executar esta etapa, você pode criar o script de teste para a ação de teste no teste de unidade.
Atualização do Transact-SQL as instruções na Transact-SQL editor para coincidir com as instruções a seguir:
-- database unit test for Sales.uspFillOrder DECLARE @RC AS INT, @CustomerID AS INT, @Amount AS INT, @FilledDate AS DATETIME, @Status AS CHAR (1); DECLARE @CustomerName AS NVARCHAR(40), @OrderID AS INT; SELECT @RC = 0, @CustomerID = 0, @OrderID = 0, @CustomerName = N'Fictitious Customer', @Amount = 100, @FilledDate = getdate(), @Status = 'O'; -- NOTE: Assumes that you inserted a Customer record with CustomerName='Fictitious Customer' in the pre-test script. SELECT @CustomerID = [CustomerID] FROM [Sales].[Customer] WHERE [CustomerName] = @CustomerName; -- Get the most recently added order. SELECT @OrderID = MAX([OrderID]) FROM [Sales].[Orders] WHERE [CustomerID] = @CustomerID; -- fill an order for that customer EXECUTE @RC = [Sales].[uspFillOrder] @OrderID, @FilledDate; -- verify that the YTDOrders value is correct. SELECT @RC = [YTDSales] FROM [Sales].[Customer] WHERE [CustomerID] = @CustomerID SELECT @RC AS RC;
No Condições de teste painel, clique na condição de teste Inconclusive e clique em Excluir condição de teste (x).
No Condições de teste painel, clique em O valor de escalar na lista e, em seguida, clique Adicionar condição de teste (+).
No Propriedades janela, defina a valor esperado a propriedade como 100.
Na barra de navegação do Designer de teste de unidade de banco de dados, clique em Sales_uspFillOrderTeste certifique-se de que pré-teste é destacada na lista adjacente. Depois de executar esta etapa, você pode especificar instruções colocar os dados do estado em que é necessário para executar o teste. Neste exemplo, você deve criar o registro do cliente antes de poder colocar um pedido.
Clique em Clique aqui para criar para criar um script pré-teste.
Atualização do Transact-SQL as instruções na Transact-SQL editor para coincidir com as instruções a seguir:
/* Add Transact-SQL statements here that you want to run before the test script is run. */ BEGIN TRANSACTION -- Add a customer for this test with the name 'CustomerB' DECLARE @NewCustomerID AS INT, @RC AS INT, @CustomerName AS NVARCHAR (40); SELECT @RC = 0, @NewCustomerID = 0, @CustomerName = N'Fictitious Customer'; IF NOT EXISTS(SELECT * FROM [Sales].[Customer] WHERE CustomerName = @CustomerName) BEGIN EXECUTE @NewCustomerID = [Sales].[uspNewCustomer] @CustomerName; END DECLARE @CustomerID AS INT, @Amount AS INT, @OrderDate AS DATETIME, @Status AS CHAR (1); SELECT @RC = 0, @CustomerID = 0, @CustomerName = N'Fictitious Customer', @Amount = 100, @OrderDate = getdate(), @Status = 'O'; -- NOTE: Assumes that you inserted a Customer record with CustomerName='Fictitious Customer' in the pre-test script. SELECT @CustomerID = [CustomerID] FROM [Sales].[Customer] WHERE [CustomerName] = @CustomerName; -- delete any old records in the Orders table and clear out the YTD Sales/Orders fields DELETE from [Sales].[Orders] WHERE [CustomerID] = @CustomerID; UPDATE [Sales].[Customer] SET YTDOrders = 0, YTDSales = 0 WHERE [CustomerID] = @CustomerID; -- place an order for that customer EXECUTE @RC = [Sales].[uspPlaceNewOrder] @CustomerID, @Amount, @OrderDate, @Status; COMMIT TRANSACTION
No menu File, clique em Save All.
Neste ponto, você está pronto para executar os testes.
Para gravar o teste de unidade de banco de dados para uspShowOrderDetails
Na barra de navegação do Designer de teste de unidade de banco de dados, clique em Sales_uspShowOrderDetailsTeste certifique-se de que teste é destacada na lista adjacente.
Depois de executar esta etapa, você pode criar o script de teste para a ação de teste no teste de unidade.
Atualização do Transact-SQL as instruções na Transact-SQL editor para coincidir com as instruções a seguir:
-- database unit test for Sales.uspFillOrder DECLARE @RC AS INT, @CustomerID AS INT, @Amount AS INT, @FilledDate AS DATETIME, @Status AS CHAR (1); DECLARE @CustomerName AS NVARCHAR(40), @OrderID AS INT; SELECT @RC = 0, @CustomerID = 0, @OrderID = 0, @CustomerName = N'Fictitious Customer', @Amount = 100, @FilledDate = getdate(), @Status = 'O'; -- NOTE: Assumes that you inserted a Customer record with CustomerName='Fictitious Customer' in the pre-test script. SELECT @CustomerID = [CustomerID] FROM [Sales].[Customer] WHERE [CustomerName] = @CustomerName; -- fill an order for that customer EXECUTE @RC = [Sales].[uspShowOrderDetails] @CustomerID; SELECT @RC AS RC;
No Condições de teste painel, clique na condição de teste Inconclusive e clique em Excluir condição de teste (x).
No Condições de teste painel, clique em Esquema esperado na lista e, em seguida, clique Adicionar condição de teste (+).
No Propriedades janela, o configuração propriedade, clique no botão Procurar ('…').
No configuração de expectedSchemaCondition1 caixa de diálogo, especifique uma conexão ao banco de dados.
Clique em recuperar.
O Transact-SQL o corpo do seu teste de unidade é executado, e o esquema resultante aparece na caixa de diálogo. Porque o código de pré-teste não foi executado, nenhum dado é retornado. Você só está verificando o esquema e não os dados, isso é bom.
Clique em OK.
O esquema previsto é armazenado com a condição de teste.
Na barra de navegação do Designer de teste de unidade de banco de dados, clique em Sales_uspShowOrderDetailsTeste certifique-se de que pré-teste é destacada na lista adjacente. Depois de executar esta etapa, você pode especificar instruções colocar os dados do estado em que é necessário para executar o teste. Neste exemplo, você deve criar o registro do cliente antes de poder colocar um pedido.
Clique em Clique aqui para criar para criar um script pré-teste.
Atualização do Transact-SQL as instruções na Transact-SQL editor para coincidir com as instruções a seguir:
/* Add Transact-SQL statements here that you want to run before the test script is run. */ BEGIN TRANSACTION -- Add a customer for this test with the name 'FictitiousCustomer' DECLARE @NewCustomerID AS INT, @RC AS INT, @CustomerName AS NVARCHAR (40); SELECT @RC = 0, @NewCustomerID = 0, @CustomerName = N'Fictitious Customer'; IF NOT EXISTS(SELECT * FROM [Sales].[Customer] WHERE CustomerName = @CustomerName) BEGIN EXECUTE @NewCustomerID = [Sales].[uspNewCustomer] @CustomerName; END DECLARE @CustomerID AS INT, @Amount AS INT, @OrderDate AS DATETIME, @Status AS CHAR (1); SELECT @RC = 0, @CustomerID = 0, @CustomerName = N'Fictitious Customer', @OrderDate = getdate(), @Status = 'O'; -- NOTE: Assumes that you inserted a Customer record with CustomerName='Fictitious Customer' in the pre-test script. SELECT @CustomerID = [CustomerID] FROM [Sales].[Customer] WHERE [CustomerName] = @CustomerName; -- delete any old records in the Orders table and clear out the YTD Sales/Orders fields DELETE from [Sales].[Orders] WHERE [CustomerID] = @CustomerID; UPDATE [Sales].[Customer] SET YTDOrders = 0, YTDSales = 0 WHERE [CustomerID] = @CustomerID; -- place 3 orders for that customer EXECUTE @RC = [Sales].[uspPlaceNewOrder] @CustomerID, 100, @OrderDate, @Status; EXECUTE @RC = [Sales].[uspPlaceNewOrder] @CustomerID, 50, @OrderDate, @Status; EXECUTE @RC = [Sales].[uspPlaceNewOrder] @CustomerID, 5, @OrderDate, @Status; COMMIT TRANSACTION
Na barra de navegação do Designer de teste de unidade de banco de dados, clique em Sales_uspShowOrderDetailsTeste clique em teste na lista adjacente.
Você deve fazer isso porque você deseja aplicar a condição de soma de verificação para o teste, e não no pré-teste.
No Condições de teste painel, clique em a soma de verificação de dados na lista e, em seguida, clique Adicionar condição de teste (+).
No Propriedades janela, o configuração propriedade, clique no botão Procurar ('…').
No configuração de checksumCondition1 caixa de diálogo, especifique uma conexão ao banco de dados.
Substituir o Transact-SQL na caixa de diálogo com o seguinte código:
BEGIN TRANSACTION -- Add a customer for this test with the name 'CustomerB' DECLARE @NewCustomerID AS INT, @RC AS INT, @CustomerName AS NVARCHAR (40); SELECT @RC = 0, @NewCustomerID = 0, @CustomerName = N'Fictitious Customer'; IF NOT EXISTS(SELECT * FROM [Sales].[Customer] WHERE CustomerName = @CustomerName) BEGIN EXECUTE @NewCustomerID = [Sales].[uspNewCustomer] @CustomerName; END DECLARE @CustomerID AS INT, @Amount AS INT, @OrderDate AS DATETIME, @Status AS CHAR (1); SELECT @RC = 0, @CustomerID = 0, @CustomerName = N'Fictitious Customer', @OrderDate = getdate(), @Status = 'O'; -- NOTE: Assumes that you inserted a Customer record with CustomerName='Fictitious Customer' in the pre-test script. SELECT @CustomerID = [CustomerID] FROM [Sales].[Customer] WHERE [CustomerName] = @CustomerName; -- delete any old records in the Orders table and clear out the YTD Sales/Orders fields DELETE from [Sales].[Orders] WHERE [CustomerID] = @CustomerID; UPDATE [Sales].[Customer] SET YTDOrders = 0, YTDSales = 0 WHERE [CustomerID] = @CustomerID; -- place 3 orders for that customer EXECUTE @RC = [Sales].[uspPlaceNewOrder] @CustomerID, 100, @OrderDate, @Status; EXECUTE @RC = [Sales].[uspPlaceNewOrder] @CustomerID, 50, @OrderDate, @Status; EXECUTE @RC = [Sales].[uspPlaceNewOrder] @CustomerID, 5, @OrderDate, @Status; COMMIT TRANSACTION -- database unit test for Sales.uspFillOrder DECLARE @FilledDate AS DATETIME; DECLARE @OrderID AS INT; SELECT @RC = 0, @CustomerID = 0, @OrderID = 0, @CustomerName = N'Fictitious Customer', @Amount = 100, @FilledDate = getdate(), @Status = 'O'; -- NOTE: Assumes that you inserted a Customer record with CustomerName='Fictitious Customer' in the pre-test script. SELECT @CustomerID = [CustomerID] FROM [Sales].[Customer] WHERE [CustomerName] = @CustomerName; -- fill an order for that customer EXECUTE @RC = [Sales].[uspShowOrderDetails] @CustomerID; SELECT @RC AS RC;
Esse código combina a Transact-SQL código no pré-teste com o Transact-SQL a partir do próprio teste. Você precisa de ambos para retornar os mesmos resultados de teste retornará ao executá-lo.
Clique em recuperar.
O Transact-SQL que você especificou é executada, e uma soma de verificação é calculada para os dados retornados.
Clique em OK.
A soma de verificação calculada é armazenada com a condição de teste. A soma de verificação esperada aparece na coluna valor da condição de teste de soma de verificação de dados.
No menu File, clique em Save All.
Neste ponto, você está pronto para executar os testes.
Executar testes de unidade de banco de dados
Para executar os testes de unidade de banco de dados
Sobre o teste , aponte para Windowse em seguida, clique em Test View.
Na janela Test View, clique em Atualizar na barra de ferramentas para atualizar a lista de testes.
O Test View janela lista de testes que você criou anteriormente e para o qual você adicionou Transact-SQL instruções e condições de teste. O teste chamada TestMethod1 está vazio e não é usado nesta explicação.
Com o botão direito Sales_uspNewCustomerTeste clique em Run Selection.
Visual Studiousa o contexto privilegiado que você especificou para se conectar ao banco de dados e aplicar o plano de geração de dados. Visual StudioAlterna para o contexto de execução antes de executar o Transact-SQL script de Test. Finalmente, Visual Studio avalia os resultados a Transact-SQL script contra aqueles que você especificou na condição de teste e um resultado de pass ou fail aparece no Test Results janela.
Exibir o resultado na Resultados de teste janela.
Os passos de teste, o que significa que SELECT instrução retorna uma linha quando ele for executar.
Repita a etapa 3 para os testes de Sales_uspPlaceNewOrderTest, Sales_uspFillOrderTest e Sales_uspShowOrderDetailsTest. Os resultados devem ser da seguinte maneira:
Teste
Resultado esperado
Sales_uspPlaceNewOrderTest
Passar
Sales_uspShowOrderDetailsTest
Passar
Sales_uspFillOrderTest
Falha com o seguinte erro: "Falha de condição de ScalarValueCondition (scalarValueCondition2): Coluna de linha 1 do conjunto de resultados 1 1: valores não coincidem, real '-100' esperado '100'." Este erro ocorre porque a definição do procedimento armazenado contém um erro secundário.
Em seguida, você irá corrigir o erro e execute novamente o teste.
Para corrigir o erro no Sales.uspFillOrder
Em Visualização Esquema, clique duas vezes o uspFillOrder procedimento armazenado para abrir a sua definição de Transact-SQL editor.
Na definição de localizar o seguinte Transact-SQL instrução:
UPDATE [Sales].[Customer] SET YTDSales = YTDSales - @Delta WHERE [CustomerID] = @CustomerID
Altere a cláusula SET na instrução para coincidir com a instrução a seguir:
UPDATE [Sales].[Customer] SET YTDSales = YTDSales + @Delta WHERE [CustomerID] = @CustomerID
Sobre o arquivo menu, clique em Salvar uspFillOrder.proc.sql.
No Test View, com o botão direito Sales_uspFillOrderTeste clique em Run Selection.
O teste passar.
Adicionar um teste de unidade negativo
Você pode criar um teste negativo para verificar que um teste falhar quando ele falhar. Por exemplo, se você tentar cancelar um pedido que já foi preenchido, esse teste deve falhar. Nesta parte da explicação, você pode criar um teste de unidade negativo para o procedimento armazenado de Sales.uspCancelOrder.
Para criar e verificar um teste negativo, você deve executar as seguintes tarefas:
O procedimento armazenado para testar condições de falha de atualização
Definir um novo teste de unidade
Modificar o código para o teste de unidade indicar que é esperado falha
Executar o teste de unidade
Para atualizar o procedimento armazenado
Na visualização Esquema, expanda o nó de SimpleUnitTestDB, expanda o nó esquemas, expanda o nó de vendas, expanda o nó de programação, expanda o nó procedimentos armazenados e clique duas vezes em uspCancelOrder.
No Transact-SQL editor, atualizar a definição de procedimento para coincidir com o seguinte código:
CREATE PROCEDURE [Sales].[uspCancelOrder] @OrderID INT AS BEGIN DECLARE @Delta INT, @CustomerID INT, @PriorStatus CHAR(1) BEGIN TRANSACTION BEGIN TRY IF (NOT EXISTS(SELECT [CustomerID] from [Sales].[Orders] WHERE [OrderID] = @OrderID)) BEGIN -- Specify WITH LOG option so that the error is -- written to the application log. RAISERROR( 'That order does not exist.', -- Message text 16, -- severity 1 -- state ) WITH LOG; END SELECT @Delta = [Amount], @CustomerID = [CustomerID], @PriorStatus = [Status] FROM [Sales].[Orders] WHERE [OrderID] = @OrderID IF @PriorStatus <> 'O' BEGIN -- Specify WITH LOG option so that the error is -- written to the application log. RAISERROR ( 'You can only cancel open orders.', -- Message text 16, -- Severity 1 -- State ) WITH LOG; END ELSE BEGIN -- If we make it to here, then we can cancel the order. Update the status to 'X' first... UPDATE [Sales].[Orders] SET [Status] = 'X' WHERE [OrderID] = @OrderID -- and then remove the amount from the YTDOrders for the customer UPDATE [Sales].[Customer] SET YTDOrders = YTDOrders - @Delta WHERE [CustomerID] = @CustomerID COMMIT TRANSACTION RETURN 1; -- indicate success END END TRY BEGIN CATCH DECLARE @ErrorMessage NVARCHAR(4000); DECLARE @ErrorSeverity INT; DECLARE @ErrorState INT; SELECT @ErrorMessage = ERROR_MESSAGE(), @ErrorSeverity = ERROR_SEVERITY(), @ErrorState = ERROR_STATE(); ROLLBACK TRANSACTION -- Use RAISERROR inside the CATCH block to return -- error information about the original error that -- caused execution to jump to the CATCH block. RAISERROR (@ErrorMessage, -- Mesasge text @ErrorSeverity, -- Severity @ErrorState -- State ); RETURN 0; -- indicate failure END CATCH; END
Sobre o arquivo menu, clique em Salvar uspCancelOrder.proc.sql.
Em Solution Explorer, com o botão direito SimpleUnitTestDB e clique em Deploy.
Para implantar as atualizações para o procedimento armazenado de uspCancelOrder. Você não alterou nenhum outro objeto, portanto, apenas que o procedimento armazenado é atualizado.
Em seguida, você define o teste de unidade associado para que este procedimento.
Para gravar o teste de unidade de banco de dados para uspCancelOrder
Na barra de navegação do Designer de teste de unidade de banco de dados, clique em Sales_uspCancelOrderTeste certifique-se de que teste é destacada na lista adjacente.
Depois de executar esta etapa, você pode criar o script de teste para a ação de teste no teste de unidade.
Atualização do Transact-SQL as instruções na Transact-SQL editor para coincidir com as instruções a seguir:
-- database unit test for Sales.uspFillOrder DECLARE @RC AS INT, @CustomerID AS INT, @Amount AS INT, @FilledDate AS DATETIME, @Status AS CHAR (1); DECLARE @CustomerName AS NVARCHAR(40), @OrderID AS INT; SELECT @RC = 0, @CustomerID = 0, @OrderID = 0, @CustomerName = N'Fictitious Customer', @Amount = 100, @FilledDate = getdate(), @Status = 'O'; -- NOTE: Assumes that you inserted a Customer record with CustomerName='Fictitious Customer' in the pre-test script. SELECT @CustomerID = [CustomerID] FROM [Sales].[Customer] WHERE [CustomerName] = @CustomerName; -- Get the most recently added order. SELECT @OrderID = MAX([OrderID]) FROM [Sales].[Orders] WHERE [CustomerID] = @CustomerID; -- try to cancel an order for that customer that has already been filled EXECUTE @RC = [Sales].[uspCancelOrder] @OrderID; SELECT @RC AS RC;
No Condições de teste painel, clique na condição de teste Inconclusive e clique em Excluir condição de teste (x).
No Condições de teste painel, clique em O valor de escalar na lista e, em seguida, clique Adicionar condição de teste (+).
No Propriedades janela, defina a valor esperado a propriedade como 0.
Na barra de navegação do Designer de teste de unidade de banco de dados, clique em Sales_uspCancelOrderTeste certifique-se de que pré-teste é destacada na lista adjacente. Depois de executar esta etapa, você pode especificar instruções colocar os dados do estado em que é necessário para executar o teste. Neste exemplo, você deve criar o registro do cliente antes de poder colocar um pedido.
Clique em Clique aqui para criar para criar um script pré-teste.
Atualização do Transact-SQL as instruções na Transact-SQL editor para coincidir com as instruções a seguir:
/* Add Transact-SQL statements here that you want to run before the test script is run. */ BEGIN TRANSACTION -- Add a customer for this test with the name 'CustomerB' DECLARE @NewCustomerID AS INT, @RC AS INT, @CustomerName AS NVARCHAR (40); SELECT @RC = 0, @NewCustomerID = 0, @CustomerName = N'Fictitious Customer'; IF NOT EXISTS(SELECT * FROM [Sales].[Customer] WHERE CustomerName = @CustomerName) BEGIN EXECUTE @NewCustomerID = [Sales].[uspNewCustomer] @CustomerName; END DECLARE @CustomerID AS INT, @Amount AS INT, @OrderDate AS DATETIME, @FilledDate AS DATETIME, @Status AS CHAR (1), @OrderID AS INT; SELECT @RC = 0, @CustomerID = 0, @OrderID = 0, @CustomerName = N'Fictitious Customer', @Amount = 100, @OrderDate = getdate(), @FilledDate = getdate(), @Status = 'O'; -- NOTE: Assumes that you inserted a Customer record with CustomerName='Fictitious Customer' in the pre-test script. SELECT @CustomerID = [CustomerID] FROM [Sales].[Customer] WHERE [CustomerName] = @CustomerName; -- delete any old records in the Orders table and clear out the YTD Sales/Orders fields DELETE from [Sales].[Orders] WHERE [CustomerID] = @CustomerID; UPDATE [Sales].[Customer] SET YTDOrders = 0, YTDSales = 0 WHERE [CustomerID] = @CustomerID; -- place an order for that customer EXECUTE @OrderID = [Sales].[uspPlaceNewOrder] @CustomerID, @Amount, @OrderDate, @Status; -- fill the order for that customer EXECUTE @RC = [Sales].[uspFillOrder] @OrderID, @FilledDate; COMMIT TRANSACTION
No menu File, clique em Save All.
Neste ponto, você está pronto para executar os testes.
Para executar os testes de unidade de banco de dados
Em Test View, com o botão direito Sales_uspCancelOrderTeste clique em Run Selection.
Exibir o resultado na Resultados de teste janela.
O teste falhar e aparece o seguinte erro:
Test method TestProject1.DatabaseUnitTests1.Sales_uspCancelOrderTest threw exception: System.Data.SqlClient.SqlException: You can only cancel open orders.
Em seguida, você pode modificar o código para indicar que a exceção é o esperado.
Para modificar o código para o teste de unidade
Em Solution Explorer, expanda TestProject1, com o botão direito DatabaseUnitTests1.cse clique em Exibir código.
No editor de código, navegue até o método Sales_uspCancelOrderTest. Modificar os atributos do método para coincidir com o código a seguir:
[TestMethod(), ExpectedSqlException(Severity=16, MatchFirstError=false, State=1)] public void Sales_uspCancelOrderTest()
Especificar o que você espera ver uma exceção específica do SQL. Opcionalmente, você pode especificar um número de erro específico. Se você não adicionar esse atributo, o teste de unidade falhará e uma mensagem é exibida na janela Test Results
No menu Arquivo, clique em Salvar DatabaseUnitTests1.cs.
Em seguida, execute novamente o teste de unidade para verificar se ele falha conforme o esperado.
Para executar novamente os testes de unidade de banco de dados
Em Test View, com o botão direito Sales_uspCancelOrderTeste clique em Run Selection.
Exibir o resultado na Resultados de teste janela.
O teste passar, o que significa que o procedimento falhou quando ele deveria falhar.
Próximas etapas
Um projeto típico, você definiria a testes de unidade adicionais para verificar se a todos os objetos de banco de dados críticos funcionam corretamente. Quando o conjunto de testes estiver concluído, você verificaria esses testes em o controle de versão para compartilhá-los com a equipe.
Depois de estabelecer uma linha de base, você pode criar e modificar objetos de banco de dados e, em seguida, criar testes associados para verificar se uma alteração interromperá o comportamento esperado.
Consulte também
Tarefas
Como: Criar um teste de unidade de banco de dados vazio
Como: Configurar a execução do teste de unidade de banco de dados
Conceitos
Criar e definir os testes de unidade de banco de dados
Verificando o banco de dados código usando testes de unidade
Geração de dados de teste para bancos de dados usando os geradores de dados