57
tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

  • Upload
    others

  • View
    31

  • Download
    0

Embed Size (px)

Citation preview

Page 1: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

tSQLt Tests:

Unit Test Your SQL

Server Code and

Sleep Better

Andy Jones

@SQLBits

#tSQLt

Page 2: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

Why?

• Robust Code

• Automate

• Save Money

• Improve Reputation

• Senior Position

• Enjoyable

• DevOps

Page 3: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

Unit Testing

Test Driven Development

tSQLt

Faking and Isolation

Third Party Tools

Agenda

Page 4: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

DevOps

“DevOps is the union of people, process, and products to enable continuous delivery of value to our end users”

Sam Guckenheimer

Page 5: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

DevOps

https://techbeacon.com/10-companies-killing-it-devops

11.7 seconds

50 per day

Thousands per day

Page 6: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

Testing?

Junior developer:

“I compile it”

Senior developer:

“How do you test

your code?”

Page 7: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

Database Release Spectrum

Page 8: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

Typical Process

Sprint Build Test Rework Test Live

Page 9: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

Could not find stored procedure 'dbo.InsertOrder'

Invalid column name 'TeamMember'

Procedure or function 'CustomerSelect' expects parameter '@Active', which was not supplied

Operand type clash: datetime2 is incompatible with int

The INSERT statement conflicted with the FOREIGN KEY constraint

Page 10: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt
Page 11: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

Blame

"It's not my code

it's your machine"

"It's not my

machine it's your

code"

Page 12: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

Unit Testing

• Same Language

• Smallest Unit

• Isolated

• Any Order

• Repeatable

• Each Test Every Time

• Automated

• Remove Human Error

• Familiar to Devs JUnit | xUnit | Pester

Page 13: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

Test Driven Development

Write Test

Test Fails CodeAll Tests

PassRefactor

All Tests Pass

Page 14: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

Measure Twice Cut Once

Page 15: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

• Open source on GitHub

• Free

• 2005 and up

• Framework and tests are TSQL

• Independent via transactions

• Methods to fake objects and isolate

tSQLt

Page 16: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

Install

http://tsqlt.org/downloads

Page 17: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

Files

Page 18: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

Demo - Install

Page 19: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt
Page 20: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

Security

Enable CLR

Page 21: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

SetClrEnabled.sql

EXECUTE sp_configure 'clr enabled', 1;RECONFIGURE;GO

Page 22: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt
Page 23: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

Star Schema

Page 24: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

Demo – Create Our First Test

Page 25: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

Test Structure

Assemble Act Assert

Page 26: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

Assemble

Fake TableFake

Function

Fake ViewSpy

Procedure

Page 27: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

Act

--Act: Call the Get_Unknown_Key functionSELECT @Actual = dbo.Get_Unknown_Key();

Page 28: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

Assert

AssertEmptyTable

AssertEquals

AssertEqualsString

AssertEqualsTable

AssertEqualsTableSchema

AssertLike

AssertNotEquals

AssertObjectDoesNotExist

AssertObjectExists

AssertResultSetsHaveSameMetaData

Fail

Page 29: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

Running Tests

Class

All

Single

Page 30: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt
Page 31: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

Prod Bugs Cost You 100x

1 1 510

100

Reqs Design Dev Test ProdSource: http://www.riceconsulting.com/public_pdf/STBC-WM.pdf

Page 32: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

Demo – Isolation

Page 33: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

Test Heuristics

Zero

OneSome

Page 34: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

Infographic

http://sqlity.net/lp-heuristics

Page 35: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

Demo – Static Data

Page 36: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

Clean Up

Not for production

EXECUTE tSQLt.Uninstall;

Page 37: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

Demo – Spy Procedure

Page 38: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

Performance Testing? Functional Only

Page 39: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

Modular

Page 40: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

Optimiser Help

Page 41: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

Which SP Are Tests

Starts

Test

Extended

Property ✓

Page 42: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

Naming Convention

EXECUTE tSQLt.NewTestClass@ClassName = 'Orders';

CREATE PROCEDURE Orders.[test Failed Order] AS

--assemble--act--assertRETURN;

Page 43: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

Extended Property

Page 44: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

tSQLt.TestClasses

CREATE VIEW tSQLt.TestClassesASSELECT s.name AS Name, s.schema_id AS SchemaIdFROM sys.extended_properties epJOIN sys.schemas s

ON ep.major_id = s.schema_idWHERE ep.name = N'tSQLt.TestClass';

Page 45: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

tSQLt.Tests

CREATE VIEW tSQLt.TestsASSELECT classes.SchemaId, classes.Name AS TestClassName,

procs.object_id AS ObjectId, procs.name AS NameFROM tSQLt.TestClasses classesJOIN sys.procedures procs ON classes.SchemaId = procs.schema_idWHERE LOWER(procs.name) LIKE 'test%';

Page 46: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

Demo – Setup Procedure

Page 47: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

Third Party Tools

Redgate Devart ApexSQL

Page 48: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

SQL Cop http://sqlcop.lessthandot.com

Page 49: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

SQL Cop

Missing Foreign

Keys

Compat Level

Column data types (Numeric

vs. Int)

Page 50: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

Standards

Page 51: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

Code Coverage

“Testing can be used to show the presence of bugs, but never to show their absence”

Edsger W. Dijkstra

Page 52: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

Summary

• Robust

• Find bugs early

• Automated

• Shared

• Repeatable

• Better you

Page 53: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

Example Database

Page 54: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

Call To Action

“The best time to plant a tree is twenty years ago. The second best time is now”

Chinese Proverb

Page 55: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

Just like Jimi Hendrix …

We love to get feedback

Please complete the session feedback forms

Page 56: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

SQLBits - It's all about the community...

Please visit Community Corner, we are trying this year to get more people to learn about the SQL Community, equally if you would be happy to visit the community corner we’d really appreciate it.

Page 57: tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better · tSQLt Tests: Unit Test Your SQL Server Code and Sleep Better Andy Jones @SQLBits #tSQLt

Thanks

Andy Jones @[email protected]