Czy ktoś odniósł sukces w testowaniu jednostkowym procedur składowanych SQL?

Odkryliśmy, że testy jednostkowe, które napisaliśmy dla naszego kodu C# / C++, naprawdę się opłaciły. Ale nadal mamy tysiące linii logiki biznesowej w procedurach przechowywanych, które naprawdę testowane są w gniewie, gdy nasz produkt jest wdrażany do dużej liczby użytkowników.

Najgorsze jest to, że niektóre z tych procedur składowanych kończą się bardzo długimi, ze względu na hit wydajności podczas przekazywania tabel tymczasowych między SPs. Uniemożliwiło nam to refaktoryzację w celu kod prostszy.

Podjęliśmy kilka prób zbudowania testów jednostkowych w oparciu o niektóre z naszych kluczowych procedur składowanych( głównie testowanie wydajności), ale okazało się, że ustawienie danych testowych dla tych testów jest naprawdę trudne. Na przykład, kończymy kopiowanie wokół testowych baz danych. Oprócz tego testy są bardzo wrażliwe na zmiany, a nawet na najmniejszą zmianę zapisanego proc. lub tabela wymaga dużej ilości zmian w testach. Więc po wielu Budach łamie się z powodu aby te testy bazy danych zawodziły sporadycznie, musieliśmy je po prostu wyciągnąć z procesu budowania.

Tak więc, główna część moich pytań brzmi: czy ktoś kiedykolwiek z powodzeniem napisał testy jednostkowe dla swoich procedur przechowywanych?

Druga część moich pytań to czy testy jednostkowe byłyby / są łatwiejsze z linq?

Myślałem, że zamiast ustawiać tabele danych testowych, możesz po prostu utworzyć zbiór obiektów testowych i przetestować swój kod linq w " linq to obiekty " sytuacja? (Jestem zupełnie nowy w linq, więc nie wiem, czy to w ogóle zadziała)

Author: Chris, 2008-08-15

16 answers

Natknąłem się na ten sam problem jakiś czas temu i okazało się, że jeśli stworzyłem prostą abstrakcyjną klasę bazową dla dostępu do danych, która pozwoliła mi wstrzyknąć połączenie i transakcję, mogłem przetestować moje Zębatki, aby zobaczyć, czy wykonali pracę w SQL, o którą poprosiłem ich, a następnie rollback, aby żadne z danych testowych nie pozostało w db.

To było lepsze niż zwykłe "uruchom skrypt, aby ustawić mój test db, a następnie po uruchomieniu testów wykonaj czyszczenie śmieci / danych testowych". To również wydawało się bliższe jednostce testowanie, ponieważ testy te mogą być uruchamiane samodzielnie w / out mając wiele z "wszystko w db musi być' tak 'przed uruchomieniem tych testów".

Oto fragment abstrakcyjnej klasy bazowej używanej do dostępu do danych

Public MustInherit Class Repository(Of T As Class)
    Implements IRepository(Of T)

    Private mConnectionString As String = ConfigurationManager.ConnectionStrings("Northwind.ConnectionString").ConnectionString
    Private mConnection As IDbConnection
    Private mTransaction As IDbTransaction

    Public Sub New()
        mConnection = Nothing
        mTransaction = Nothing
    End Sub

    Public Sub New(ByVal connection As IDbConnection, ByVal transaction As IDbTransaction)
        mConnection = connection
        mTransaction = transaction
    End Sub

    Public MustOverride Function BuildEntity(ByVal cmd As SqlCommand) As List(Of T)

    Public Function ExecuteReader(ByVal Parameter As Parameter) As List(Of T) Implements IRepository(Of T).ExecuteReader
        Dim entityList As List(Of T)
        If Not mConnection Is Nothing Then
            Using cmd As SqlCommand = mConnection.CreateCommand()
                cmd.Transaction = mTransaction
                cmd.CommandType = Parameter.Type
                cmd.CommandText = Parameter.Text
                If Not Parameter.Items Is Nothing Then
                    For Each param As SqlParameter In Parameter.Items
                        cmd.Parameters.Add(param)
                    Next
                End If
                entityList = BuildEntity(cmd)
                If Not entityList Is Nothing Then
                    Return entityList
                End If
            End Using
        Else
            Using conn As SqlConnection = New SqlConnection(mConnectionString)
                Using cmd As SqlCommand = conn.CreateCommand()
                    cmd.CommandType = Parameter.Type
                    cmd.CommandText = Parameter.Text
                    If Not Parameter.Items Is Nothing Then
                        For Each param As SqlParameter In Parameter.Items
                            cmd.Parameters.Add(param)
                        Next
                    End If
                    conn.Open()
                    entityList = BuildEntity(cmd)
                    If Not entityList Is Nothing Then
                        Return entityList
                    End If
                End Using
            End Using
        End If

        Return Nothing
    End Function
End Class

Następnie zobaczysz przykładową klasę dostępu do danych za pomocą powyższej bazy, aby uzyskać listę Produktów

Public Class ProductRepository
    Inherits Repository(Of Product)
    Implements IProductRepository

    Private mCache As IHttpCache

    'This const is what you will use in your app
    Public Sub New(ByVal cache As IHttpCache)
        MyBase.New()
        mCache = cache
    End Sub

    'This const is only used for testing so we can inject a connectin/transaction and have them roll'd back after the test
    Public Sub New(ByVal cache As IHttpCache, ByVal connection As IDbConnection, ByVal transaction As IDbTransaction)
        MyBase.New(connection, transaction)
        mCache = cache
    End Sub

    Public Function GetProducts() As System.Collections.Generic.List(Of Product) Implements IProductRepository.GetProducts
        Dim Parameter As New Parameter()
        Parameter.Type = CommandType.StoredProcedure
        Parameter.Text = "spGetProducts"
        Dim productList As List(Of Product)
        productList = MyBase.ExecuteReader(Parameter)
        Return productList
    End Function

    'This function is used in each class that inherits from the base data access class so we can keep all the boring left-right mapping code in 1 place per object
    Public Overrides Function BuildEntity(ByVal cmd As System.Data.SqlClient.SqlCommand) As System.Collections.Generic.List(Of Product)
        Dim productList As New List(Of Product)
        Using reader As SqlDataReader = cmd.ExecuteReader()
            Dim product As Product
            While reader.Read()
                product = New Product()
                product.ID = reader("ProductID")
                product.SupplierID = reader("SupplierID")
                product.CategoryID = reader("CategoryID")
                product.ProductName = reader("ProductName")
                product.QuantityPerUnit = reader("QuantityPerUnit")
                product.UnitPrice = reader("UnitPrice")
                product.UnitsInStock = reader("UnitsInStock")
                product.UnitsOnOrder = reader("UnitsOnOrder")
                product.ReorderLevel = reader("ReorderLevel")
                productList.Add(product)
            End While
            If productList.Count > 0 Then
                Return productList
            End If
        End Using
        Return Nothing
    End Function
End Class

A teraz w teście jednostkowym możesz również dziedziczyć z bardzo prostej klasy bazowej, która wykonuje Twoją konfigurację / rollback - lub przechowuj to na podstawie testu jednostkowego

Poniżej znajduje się prosta podstawowa klasa testowa, której użyłem

Imports System.Configuration
Imports System.Data
Imports System.Data.SqlClient
Imports Microsoft.VisualStudio.TestTools.UnitTesting

Public MustInherit Class TransactionFixture
    Protected mConnection As IDbConnection
    Protected mTransaction As IDbTransaction
    Private mConnectionString As String = ConfigurationManager.ConnectionStrings("Northwind.ConnectionString").ConnectionString

    <TestInitialize()> _
    Public Sub CreateConnectionAndBeginTran()
        mConnection = New SqlConnection(mConnectionString)
        mConnection.Open()
        mTransaction = mConnection.BeginTransaction()
    End Sub

    <TestCleanup()> _
    Public Sub RollbackTranAndCloseConnection()
        mTransaction.Rollback()
        mTransaction.Dispose()
        mConnection.Close()
        mConnection.Dispose()
    End Sub
End Class

I wreszcie-poniżej jest prosty test z użyciem tej klasy bazowej testu, który pokazuje, jak przetestować cały cykl CRUD, aby upewnić się, że wszystkie koła zębate wykonują swoją pracę i że Twój ado.net kod poprawnie odwzorowuje lewo-prawo

Wiem, że to nie testuje sproc "spGetProducts" użytego w powyższej próbce dostępu do danych, ale powinieneś zobaczyć moc za to podejście do badań jednostkowych zębatek

Imports SampleApplication.Library
Imports System.Collections.Generic
Imports Microsoft.VisualStudio.TestTools.UnitTesting

<TestClass()> _
Public Class ProductRepositoryUnitTest
    Inherits TransactionFixture

    Private mRepository As ProductRepository

    <TestMethod()> _
    Public Sub Should-Insert-Update-And-Delete-Product()
        mRepository = New ProductRepository(New HttpCache(), mConnection, mTransaction)
        '** Create a test product to manipulate throughout **'
        Dim Product As New Product()
        Product.ProductName = "TestProduct"
        Product.SupplierID = 1
        Product.CategoryID = 2
        Product.QuantityPerUnit = "10 boxes of stuff"
        Product.UnitPrice = 14.95
        Product.UnitsInStock = 22
        Product.UnitsOnOrder = 19
        Product.ReorderLevel = 12
        '** Insert the new product object into SQL using your insert sproc **'
        mRepository.InsertProduct(Product)
        '** Select the product object that was just inserted and verify it does exist **'
        '** Using your GetProductById sproc **'
        Dim Product2 As Product = mRepository.GetProduct(Product.ID)
        Assert.AreEqual("TestProduct", Product2.ProductName)
        Assert.AreEqual(1, Product2.SupplierID)
        Assert.AreEqual(2, Product2.CategoryID)
        Assert.AreEqual("10 boxes of stuff", Product2.QuantityPerUnit)
        Assert.AreEqual(14.95, Product2.UnitPrice)
        Assert.AreEqual(22, Product2.UnitsInStock)
        Assert.AreEqual(19, Product2.UnitsOnOrder)
        Assert.AreEqual(12, Product2.ReorderLevel)
        '** Update the product object **'
        Product2.ProductName = "UpdatedTestProduct"
        Product2.SupplierID = 2
        Product2.CategoryID = 1
        Product2.QuantityPerUnit = "a box of stuff"
        Product2.UnitPrice = 16.95
        Product2.UnitsInStock = 10
        Product2.UnitsOnOrder = 20
        Product2.ReorderLevel = 8
        mRepository.UpdateProduct(Product2) '**using your update sproc
        '** Select the product object that was just updated to verify it completed **'
        Dim Product3 As Product = mRepository.GetProduct(Product2.ID)
        Assert.AreEqual("UpdatedTestProduct", Product2.ProductName)
        Assert.AreEqual(2, Product2.SupplierID)
        Assert.AreEqual(1, Product2.CategoryID)
        Assert.AreEqual("a box of stuff", Product2.QuantityPerUnit)
        Assert.AreEqual(16.95, Product2.UnitPrice)
        Assert.AreEqual(10, Product2.UnitsInStock)
        Assert.AreEqual(20, Product2.UnitsOnOrder)
        Assert.AreEqual(8, Product2.ReorderLevel)
        '** Delete the product and verify it does not exist **'
        mRepository.DeleteProduct(Product3.ID)
        '** The above will use your delete product by id sproc **'
        Dim Product4 As Product = mRepository.GetProduct(Product3.ID)
        Assert.AreEqual(Nothing, Product4)
    End Sub

End Class

Wiem, że jest to długi przykład, ale pomogło to mieć klasę wielokrotnego użytku do pracy z dostępem do danych i kolejną klasę wielokrotnego użytku do moich testów, więc nie musiałem robić pracy setup/teardown w kółko;)

 12
Author: Toran Billups,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-26 12:12:58

Próbowałeś DBUnit ? Jest przeznaczony do jednostkowego testowania bazy danych i tylko bazy danych, bez konieczności przechodzenia przez kod C#.

 10
Author: Jon Limjap,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-15 15:35:02

Jeśli myślisz o kodzie, który testowanie jednostkowe ma tendencję do promowania: małych wysoce spójnych i nisko sprzężonych procedur, powinieneś być w stanie zobaczyć, gdzie może być przynajmniej część problemu.

W moim cynicznym świecie, procedury przechowywane są częścią wieloletniej próby świata RDBMS, aby przekonać cię do przeniesienia przetwarzania biznesowego do bazy danych, co ma sens, jeśli wziąć pod uwagę, że koszty licencji serwera są związane z takimi rzeczami, jak procesor licz. Im więcej rzeczy uruchomisz w swojej bazie danych, tym więcej z Ciebie zrobią.

Ale odnoszę wrażenie, że bardziej interesuje Cię wydajność, która wcale nie jest zachętą do testów jednostkowych. Testy jednostkowe mają być dość atomowe i mają na celu sprawdzenie zachowania, a nie wydajności. W takim przypadku prawie na pewno będziesz potrzebował obciążeń klasy produkcyjnej, aby sprawdzić plany zapytań.

Myślę, że potrzebujesz innej klasy testów środowisko. Sugerowałbym kopię produkcji jako najprostszą, zakładając, że bezpieczeństwo nie jest problemem. Następnie dla każdego wydania kandydującego zaczynasz od poprzedniej wersji, migrujesz przy użyciu procedur wydania (co da dobre testy jako efekt uboczny) i uruchamiasz swoje timingi.

Coś w tym stylu.

 6
Author: Mike Woodhouse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-15 15:51:15

Kluczem do testowania procedur składowanych jest napisanie skryptu, który zapełnia pustą bazę danych danymi, które są wcześniej zaplanowane w celu uzyskania spójnego zachowania podczas wywoływania procedur składowanych.

Muszę oddać głos za zdecydowanie faworyzowaniem procedur przechowywanych i umieszczaniem logiki biznesowej tam ,gdzie (i większość DBAs) myślę, że należy, w bazie danych.

Wiem, że my jako inżynierowie oprogramowania chcemy pięknie zrefakturowanego kodu, napisanego w naszym ulubionym języku, aby zawierają całą naszą ważną logikę, ale realia wydajności w systemach o dużej objętości i krytyczny charakter integralności danych wymagają od nas pewnych kompromisów. Kod Sql może być brzydki, powtarzalny i trudny do przetestowania, ale nie wyobrażam sobie trudności z dostrajaniem bazy danych bez pełnej kontroli nad projektem zapytań.

Często jestem zmuszony do całkowitego przeprojektowania zapytań, włączenia zmian w modelu danych, aby wszystko działało w akceptowalnym czasie. W przypadku procedur składowanych mogę zapewnić, że zmiany będą przejrzyste dla wywołującego, ponieważ procedura składowana zapewnia tak doskonałą hermetyzację.

 6
Author: Eric Z Beard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-15 17:27:51

Zakładam, że chcesz testować jednostki w MSSQL. Patrząc na DBUnit są pewne ograniczenia w jego obsłudze dla MSSQL. Na przykład nie obsługuje NVarChar. Oto prawdziwi użytkownicy i ich problemy z DBUnit.

 4
Author: RedWolves,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-15 15:40:50

Dobre pytanie.

Mam podobne problemy i obrałem ścieżkę najmniejszego oporu(dla mnie zresztą).

Istnieje kilka innych rozwiązań, o których wspominali inni. Wiele z nich jest lepszych / czystszych / bardziej odpowiednich dla innych.

Już używałem Testdriven.NET/MbUnit aby przetestować mój C#, więc po prostu dodałem testy do każdego projektu, aby wywołać procedury przechowywane używane przez tę aplikację.

Wiem, wiem. To brzmi okropnie, ale potrzebuję tego. aby rozpocząć niektóre testy, i przejść stamtąd. To podejście oznacza, że chociaż mój zasięg jest niski, testuję niektóre przechowywane PROCKI w tym samym czasie, co testuję kod, który je wywoła. Jest w tym jakaś logika.

 4
Author: AJ.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-02 11:40:52

Jestem dokładnie w tej samej sytuacji co oryginalny plakat. Sprowadza się to do wydajności kontra testowalności. Moja tendencja jest w kierunku testowalności (make it work, make it right, make it fast), co sugeruje utrzymanie logiki biznesowej z bazy danych. Bazy danych nie tylko nie posiadają frameworków testowych, konstrukcji faktoringu kodu oraz narzędzi do analizy kodu i nawigacji występujących w językach takich jak Java, ale także wysoce faktorowany kod bazy danych jest powolny(gdzie wysoce faktorowany kod Java nie jest).

Jednak rozpoznaję moc przetwarzania zestawów baz danych. Przy odpowiednim użyciu, SQL może zrobić kilka niewiarygodnie potężnych rzeczy z bardzo małą ilością kodu. Tak więc, jestem ok z niektórych zestaw logiki opartej na życie w bazie danych, mimo że nadal będę robić wszystko, co mogę, aby przetestować go.

W związku z tym wydaje się, że bardzo długi i proceduralny kod bazy danych jest często objawem czegoś innego i myślę, że taki kod można przekonwertować na testowalny kod bez ponoszenia wydajności hit. Teoria jest taka, że taki kod często reprezentuje procesy wsadowe, które okresowo przetwarzają duże ilości danych. Jeśli te procesy wsadowe miały zostać przekonwertowane na mniejsze kawałki logiki biznesowej w czasie rzeczywistym, która działa za każdym razem, gdy dane wejściowe zostaną zmienione, logika ta może być uruchomiona na poziomie średnim (gdzie można ją przetestować) bez uszczerbku dla wydajności (ponieważ praca jest wykonywana w małych kawałkach w czasie rzeczywistym). Jako efekt uboczny eliminuje to również długie pętle sprzężenia zwrotnego błędu procesu wsadowego obsługa. Oczywiście takie podejście nie będzie działać we wszystkich przypadkach, ale może działać w niektórych. Ponadto, jeśli w Twoim systemie znajduje się mnóstwo tak nietestowalnego kodu bazy danych przetwarzania wsadowego, droga do zbawienia może być długa i żmudna. YMMV.

 3
Author: thvo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-02 06:08:33
Ale odnoszę wrażenie, że bardziej interesuje Cię wydajność, która wcale nie jest zachętą do testów jednostkowych. Testy jednostkowe mają być dość atomowe i mają na celu sprawdzenie zachowania, a nie wydajności. W takim przypadku prawie na pewno będziesz potrzebował obciążeń klasy produkcyjnej, aby sprawdzić plany zapytań.

Myślę, że są tu dwa całkiem różne obszary testowania: wydajność i faktyczna logika procedur składowanych.

Podałem przykład testowania wydajności db w przeszłości i, na szczęście, osiągnęliśmy punkt, w którym wydajność jest wystarczająco dobra.

Całkowicie się Zgadzam, że sytuacja z całą logiką biznesową w bazie danych jest zła, ale jest to coś, co odziedziczyliśmy, zanim większość naszych programistów dołączyła do firmy.

Jednak teraz przyjmujemy Model usług internetowych dla naszych nowych funkcji i staraliśmy się unikać procedur składowanych tak bardzo jak to możliwe, zachowując logikę w kodzie C# i uruchamiając polecenia SQL w bazie danych (chociaż linq byłby teraz preferowaną metodą). Nadal istnieje pewne wykorzystanie istniejących SPs, dlatego myślałem o retrospektywnym testowaniu jednostkowym.

 2
Author: John Sibly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-15 16:53:22

Możesz również wypróbować Visual Studio dla specjalistów od baz danych . Chodzi głównie o zarządzanie zmianami, ale ma również narzędzia do generowania danych testowych i testów jednostkowych.

To dość drogie tho.

 2
Author: Craig,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-18 09:41:19

Używamy DataFresh do cofania zmian między każdym testem, a następnie testowanie zębatek jest stosunkowo łatwe.

Wciąż brakuje narzędzi do pokrycia kodu.

 1
Author: Keith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-15 16:41:34

Przeprowadzam testy jednostkowe biedaka. Jeśli jestem leniwy, test to tylko kilka ważnych wywołań z potencjalnie problematycznymi wartościami parametrów.

/*

--setup
Declare @foo int Set @foo = (Select top 1 foo from mytable)

--test
execute wish_I_had_more_Tests @foo

--look at rowcounts/look for errors
If @@rowcount=1 Print 'Ok!' Else Print 'Nokay!'

--Teardown
Delete from mytable where foo = @foo
*/
create procedure wish_I_had_more_Tests
as
select....
 1
Author: MatthewMartin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-29 03:32:32

LINQ uprości to tylko wtedy, gdy usuniesz logikę z procedur przechowywanych i zaimplementujesz ją jako zapytania linq. Które byłyby znacznie bardziej wytrzymałe i łatwiejsze do przetestowania, zdecydowanie. Wygląda jednak na to, że Twoje wymagania wykluczają to.

TL;DR: Twój projekt ma problemy.

 0
Author: Will,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-15 15:44:00

Testujemy kod C#, który wywołuje SPs.
Mamy Skrypty budujące, tworzące czyste testowe bazy danych.
I większe mocujemy i odłączamy podczas mocowania testowego.
Te testy mogą zająć godziny, ale myślę, że warto.

 0
Author: John Smithers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-15 15:51:21

Jedną z opcji ponownego uwzględnienia kodu (przyznam, że brzydki hack) byłoby wygenerowanie go przez CPP (preprocesor C) M4 (nigdy nie próbowałem) lub tym podobne. Mam projekt, który właśnie to robi i jest w zasadzie wykonalny.

Jedyny przypadek, dla którego myślę, że może być ważny, to 1) jako alternatywa dla procedur składowanych KLOC+ i 2) i to jest mój przypadek, gdy celem projektu jest sprawdzenie, jak daleko (do szaleństwa) można popchnąć technologię.

 0
Author: BCS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-15 17:09:23

O rany. koła zębate nie nadają się do (zautomatyzowanych) testów jednostkowych. I sortowania "test jednostkowy" moje złożone Zębatki przez pisanie testów w plikach wsadowych T-sql i ręczne sprawdzanie wyjścia instrukcji print i wyników.

 0
Author: Booji Boy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-15 19:35:27

Problem z testowaniem jednostkowym dowolnego rodzaju programowania związanego z danymi polega na tym, że na początek musisz mieć wiarygodny zestaw danych testowych. Wiele zależy również od złożoności przechowywanego proc i tego, co robi. Bardzo trudno byłoby zautomatyzować testy jednostkowe dla bardzo złożonej procedury, która zmodyfikowała wiele tabel.

Niektóre z innych plakatów zwróciły uwagę na kilka prostych sposobów automatyzacji ich ręcznego testowania, a także na niektóre narzędzia, których możesz użyć z SQL Server. Po stronie Oracle, PL / SQL guru Steven Feuerstein pracował nad darmowym narzędziem do testowania jednostek dla procedur składowanych PL/SQL o nazwie utPLSQL.

Jednak porzucił ten wysiłek i udał się na reklamę z testerem kodu questa dla PL / SQL. Quest oferuje bezpłatną wersję próbną do pobrania. Jestem na skraju wypróbowania go; rozumiem, że jest dobry w dbaniu o koszty związane z tworzeniem ram testowych, abyś mógł skupić się na samych testach, i utrzymuje testy, abyś mógł je ponownie wykorzystać w testowanie regresji, jedna z wielkich zalet test-driven-development. Ponadto, ma być dobry w czymś więcej niż tylko sprawdzanie zmiennej wyjściowej i ma przepis na walidację zmian danych, ale i tak muszę się bliżej przyjrzeć. Myślałem, że te informacje mogą być cenne dla użytkowników Oracle.

 0
Author: Bernard Dy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-18 00:07:13