Slide 1

Slide 1 text

ADDING UNIT TESTS WITH TSQLT TO THE DATABASE DEPLOYMENT PIPELINE Eduardo Piairo @EdPiairo #sqlsatcambridge

Slide 2

Slide 2 text

ABOUT ME Adding unit tests with tSQLt to the database deployment pipeline @EdPiairo, #sqlsatcambridge @EdPiairo https://pt.linkedin.com/in/eduardopiairo [email protected] https://www.eduardopiairo.com Eduardo Piairo DevOps Coach @ Natixis | DevOps Porto Founder |Friend of Redgate

Slide 3

Slide 3 text

TSQLT Adding unit tests with tSQLt to the database deployment pipeline • Database unit testing framework for Microsoft SQL Server • Allow to write T-SQL code as tests • Tests are automatically run within transactions • Provides a way to isolate code and tables using mocking • Output can be plain text or XML @EdPiairo, #sqlsatcambridge

Slide 4

Slide 4 text

TSQLT INSTALL Adding unit tests with tSQLt to the database deployment pipeline • tSQLt.class.sql • CLR • clr enabled • clr strict security • Should be installed in the development database @EdPiairo, #sqlsatcambridge

Slide 5

Slide 5 text

WHAT’S A TSQLT TEST? Adding unit tests with tSQLt to the database deployment pipeline • Stored Procedure • Starts with the word test • Must be in a schema that contains the extended property tSQLt.TestClass = 1 • tSQLt.NewTestClass • Each test is wrapped in a transaction • Modifications are rolled back and the results saved @EdPiairo, #sqlsatcambridge

Slide 6

Slide 6 text

WHAT’S A TSQLT TEST? Adding unit tests with tSQLt to the database deployment pipeline • Benefits • Business requirements documentation • Code refactoring • Isolation - unrelated changes do not affect other parts of the system • Help structure code into distinct components – keep it small @EdPiairo, #sqlsatcambridge

Slide 7

Slide 7 text

TSQLT CREATE Adding unit tests with tSQLt to the database deployment pipeline EXEC tSQLt.NewTestClass my_new_test_class’; GO CREATE PROCEDURE my_new_test_class.[test something imortant] AS BEGIN -------Assemble --This section is for code that sets up the environment -------Act -- Execute the code under test like a stored procedure, function or view -- and capture the results in variables or tables. -------Assert -- Compare the expected and actual END; @EdPiairo, #sqlsatcambridge

Slide 8

Slide 8 text

TSQLT RUN Adding unit tests with tSQLt to the database deployment pipeline • tSQLt.RunAll • Execute all the tests • tSQLt.Run '[your_test_class].[your_test] • Execute a specific test • tSQLt.Run '[your_test_class]' • Execute a specific test class @EdPiairo, #sqlsatcambridge

Slide 9

Slide 9 text

WHAT CAN BE TESTED? Adding unit tests with tSQLt to the database deployment pipeline • Stored Procedures • Functions • Views • Tables • Tables constrains that are critical @EdPiairo, #sqlsatcambridge

Slide 10

Slide 10 text

TESTING (WHITOUT DATA) Adding unit tests with tSQLt to the database deployment pipeline • Unit tests is about testing code • You do not need a database full of data, you need the opposite • Makes creating unit tests easy • Data setup • Only the necessary data for making the test work is needed • Mocking • tSQLt.FakeTable • tSQLt.FakeFunction • tSQLt.SpyProcedure @EdPiairo, #sqlsatcambridge

Slide 11

Slide 11 text

ISOLATING OBJECTS Adding unit tests with tSQLt to the database deployment pipeline • tSQLt.FakeTable • Fakes the original table without constrains • Isolate the table from constrains – I don’t need unnecessary data • tSQL.FakeFunction • Simply replaces the original function • Allow to simplify the logic • tSQLt.SpyProcedure • Replace the original SP with a spy • The spy will record the parameters that were passed to it @EdPiairo, #sqlsatcambridge

Slide 12

Slide 12 text

ISOLATING OBJECTS Adding unit tests with tSQLt to the database deployment pipeline • ApplyConstraint • RemoveObjectIfExists • ApplyTrigger • RemoveObject @EdPiairo, #TugaIT

Slide 13

Slide 13 text

ASSERTS Adding unit tests with tSQLt to the database deployment pipeline • tSQLt.AsserEquals • tSQLr.AssertEqualsTable • tSQLt.AssertEmptyTable • tSQLt.AssertEqualsString • tSQLt.AssertEqualsTableSchema • tSQLt.AssertLike • tSQLt.AssertNotEquals • AssertObjectDoesNotExist • AssertObjectExists • AssertResultSetsHaveSameMetaData • Fail @EdPiairo, #sqlsatcambridge

Slide 14

Slide 14 text

SQLTEST Adding unit tests with tSQLt to the database deployment pipeline • Redgate SQL Test • Add-in for SSMS for creating and running unit tests • Measure the code coverage of those tests @EdPiairo, #sqlsatcambridge

Slide 15

Slide 15 text

ADDING TSQLT TO THE DEPLOYMENT PIPEPLINE Adding unit tests with tSQLt to the database deployment pipeline Source Control Continuous Integration Continuous Delivery @EdPiairo, #sqlsatcambridge

Slide 16

Slide 16 text

ADDING TSQLT TO THE DEPLOYMENT PIPEPLINE Adding unit tests with tSQLt to the database deployment pipeline Source Control Continuous Integration Continuous Delivery @EdPiairo, #sqlsatcambridge

Slide 17

Slide 17 text

SOURCE CONTROL Adding unit tests with tSQLt to the database deployment pipeline • GitHub • T-SQL migrations • tSQLt tests • Pester tests • Building scripts @EdPiairo, #sqlsatcambridge

Slide 18

Slide 18 text

CONTINUOUS INTEGRATION Adding unit tests with tSQLt to the database deployment pipeline • VSTS • TEST environment setup (Local Machine | Docker) • Test and Report • Build artefact @EdPiairo, #sqlsatcambridge

Slide 19

Slide 19 text

CONTINUOUS DELIVERY Adding unit tests with tSQLt to the database deployment pipeline • Octopus Deploy • Local Machine • Azure @EdPiairo, #sqlsatcambridge

Slide 20

Slide 20 text

REFERENCES & MATERIALS Adding unit tests with tSQLt to the database deployment pipeline • References • https://tsqlt.org/user-guide/ • https://courses.agilesql.club/ • Source code available @ GitHub • https://github.com/eduardopiairo/devopsporto-db @EdPiairo, #sqlsatcambridge

Slide 21

Slide 21 text

Q&A Adding unit tests with tSQLt to the database deployment pipeline @EdPiairo, #sqlsatcambridge @EdPiairo https://pt.linkedin.com/in/eduardopiairo [email protected] https://www.eduardopiairo.com