Testowanie baz danych MS SQL za pomocą Visual Studio 2015. Część I.

O testowaniu baz danych mówi i pisze się niewiele. Okazuje się jednak, że istnieje sporo możliwości szybkiego generowania automatycznych testów do baz danych. Zapraszamy do lektury pierwszej części artykułu.

 

1. Wstęp

W branży IT bardzo często mówi się o testach funkcjonalnych, testach regresji, testach jednostkowych, testach integracyjnych, z którymi bardzo często związana jest automatyzacja testowania. Rodzaje oraz poziomy testów nie są niczym nowym w dzisiejszych czasach. Jeśli jednak popatrzymy na bazy danych, to stwierdzenie, że „tematyka testowania baz danych jest znana powszechnie” jest z pewnością nieprawdą. Mało mówi się oraz mało pisze się o tym, w jaki sposób można testować bazy danych, niekoniecznie z poziomu testów jednostkowych metod zawartych w klasach, które są odpowiedzialne za operacje CRUD w bazach danych. Okazuje się, że można przeprowadzać sporo testów baz danych z poziomu samej bazy. Jednak przed zaprojektowaniem oraz implementacją tego rodzaju testów należy zastanowić się, co tak naprawdę powinno zostać przetestowane i czy testy mają sens.

 

2. Sformułowanie problemu

Współczesne bazy danych to już nie tylko tabele, referencje, więzy integralności i dane. Bazy te umożliwiają wykonywanie czynności programistycznych np. definiowanie funkcji, definiowanie widoków, definiowanie procedur (w tym triggerów), zawierają sporo instrukcji (możliwość wstawienia pętli), które czynią bazę naprawdę ciekawym narzędziem z punktu widzenia programowania oraz testowania. Testowanie regresyjne przeprowadza się po to, aby potwierdzić, że zmiany lub nowe funkcjonalności nie wprowadziły nowych defektów. Taka sytuacja może również zaistnieć w bazie danych. W sytuacji, gdy baza wymaga utworzenia wielu funkcji skalarnych czy tabelarycznych, procedur, które są silnie ze sobą powiązane oraz dodatkowo zmieniane z każdą nową wersją, testowanie regresyjne ma sens i powinno być przeprowadzane. Testy takie można napisać na wiele sposobów. W artykule opisane zostanie postępowanie dotyczące projektowania testów dla baz danych MS SQL przy pomocy Visual Studio 2015.

 

3. Konfigurowanie  środowiska Visual Studio 2015 i tworzenie testu dla funkcji skalarnej

 Do zaprojektowania testów baz danych wymagane są takie narzędzia jak:

  • Microsoft Visual Studio Enterprise 2015, 
  • dodatek SQL Server Data Tools do Visual Studio, który umożliwi utworzenie projektu z testami i połączenie się z bazą danych MS SQL,
  • Microsoft SQL Server lub  Microsoft SQL Server Management Studio (wystarczy Express),
  • baza danych - w artykule jest wykorzystana baza AdventureWorks (baza firmy Microsoft, którą można używać w celach szkoleniowych).

 

Schemat postępowania jest następujący:

3.1. Należy uruchomić Visual Studio, wybrać przycisk [File] -> [New Project]. Ukaże się okienko, w którym wybiera się SQL Serwer Database Project, tak jak niżej na obrazku:

 

Po wpisaniu nazwy projektu oraz wybraniu ścieżki należy kliknąć [OK].

 

3.2 Następnie należy rozwinąć polecenie [View], wybrać [Solution Explorer] oraz [SQL Server Object Explorer]:

 

3.3  W miejscu, w którym ukazał się SQL Explorer, należy kliknąć prawym przyciskiem myszki na napis SQL Server oraz wybrać [Add SQL Server]:

 

Osoba tworząca testy wpisuje nazwę serwera oraz wybiera bazę danych, jak niżej na obrazku:

 

Osoba tworząca testy klika przycisk [Connect] w sekcji Server Explorer ukaże się schemat bazy danych:

 

Wszystkie elementy bazy danych zostały dodane do projektu. 

 

3.4 Następny krok to dodanie bazy danych do solucji DatabaseFunctionalTests. W tym celu należy kliknąć prawym przyciskiem myszki na bazę widoczną w sekcji [SQL Server Object Explorer], a następnie wybierać polecenie [Create New Project]:

 

Następnie należy wskazać lokalizację oraz podać nazwę projektu:

 

Klikamy [Start]. Po zakończeniu operacji importu bazy danych do solucji należy kliknąć [Finish]. W wyniku wcześniej pisanych operacji do solucji zostanie zaimportowana cała baza danych:

 

3.5 W tym kroku można już wygenerować test dla dowolnej funkcji zdefiniowanej w bazie danych. Robi się to klikając prawym przyciskiem myszki na dowolną funkcję, a następnie wybierając opcję [Create Unit Test]:

 

Pojawi się okno, w którym podaje się nazwę klasy i nazwę projektu, który będzie zawierał testy:

 

Domyślnie zaznaczona jest pierwsza funkcja od góry. Można jednak zaznaczyć więcej funkcji od razu albo robić testy po kolei, dodając je do tej samej klasy. Aby zakończyć generowanie testu, należy kliknąć [OK]. Po wykonaniu kroków 3.1-3.5 do solucji dodane zostaną nowe elementy, takie jak klasy SQLDatabaseSetup.cs, SqlServerFunctionsTests.cs, UnitTest1.cs oraz odpowiednie referencje, które będą umożliwiały definiowanie oraz projektowanie testów. 

Klasa UnitTest1.cs (dodana automatycznie) zawiera jedną metodę testową:

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
 
namespace SqlServerFunctionsTests
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
        }
    }
}

 

Metoda ta nie jest potrzebna do testów, które będą prezentowane w artykule, więc należy ją zakomentować lub usunąć. Klasa SQLDatabaseSetup.cs to klasa utworzona automatycznie, która służy do inicjalizacji testów. Zawiera tylko jedną metodę:

namespace FunctionsTests
{
    [TestClass()]
    publicclass SqlDatabaseSetup
    {
 
        [AssemblyInitialize()]
        public static void InitializeAssembly(TestContext ctx)
        {
            // Setup the test database based on setting in the
            // configuration file
            SqlDatabaseTestClass.TestService.DeployDatabaseProject();
            SqlDatabaseTestClass.TestService.GenerateData();
        }
 
    }
}
 
 

Klasa SQLDatabaseSetup.cs to klasa, która jest pochodną klasy bazowej SqlDatabaseTestClass.cs. Klasa SqlDatabaseTestClass.cs zawiera podstawowe akcje, związane z wykonaniem testów oraz definiowaniem połączenia do bazy danych:

 
using System.ComponentModel;
using System.ComponentModel.Design;
using System.ComponentModel.Design.Serialization;
using Microsoft.VisualStudio.TestTools.UnitTesting;
 
...
 
    public class SqlDatabaseTestClass : Component
    {
        public SqlDatabaseTestClass();
 
        public static SqlDatabaseTestService TestService { get; set; }
        [Browsable(false)]
        public SqlDatabaseTestAction TestCleanupAction { get; set; }
        [Browsable(false)]
        public TestContext TestContext { get; set; }
        [Browsable(false)]
        public SqlDatabaseTestAction TestInitializeAction { get; set; }
        [Browsable(false)]
        protected ConnectionContext ExecutionContext { get; set; }
        [Browsable(false)]
        protected ConnectionContext PrivilegedContext { get; set; }
 
        protected void CleanupTest();
        protected void InitializeTest();
    }

 

Klasa SqlServerFunctionsTests.cs zawiera testy oraz definiuje zmienne przekazywane do testów jako dane wejściowe albo dane wyjściowe. Znajduje się tam metoda, która umożliwia wykonanie akcji przed rozpoczęciem testu, wykonanie samego testu lub wykonanie akcji po zakończeniu testu. Klasa ta zawiera dodatkowo element z rozszerzeniem *.resx, który stanowi listę testów prezentując ich nazwę oraz zmienne:

 

Lista ta jest edytowalna oraz umożliwia dodanie komentarza do testu. Metody, które odpowiadają za samo wykonanie testów to InitializeComponent() oraz dbo_ufnGetAccountingEndDateTest(). Pierwsza z nich definiuje zmienne dla testów (wspólna metoda dla wszystkich testów w danej klasie), a druga stanowi sam test (ma identyczną nazwę jak testowana funkcja w bazie danych).

 

Autor: Marek Żukowicz

 

 

SPRAWDŹ TAKŻE
Testowanie baz danych MS SQL za pomocą Visual Studio 2015. Część II. 

 

 

 

Najbliższe terminy szkoleń

Partnerzy

Narzędzia testerskie