46
SmokeTests Why you should try to burn down your production environment Comments & Feedback

Smoke Tests @ DevOps-Hamburg 06.02.2017

Embed Size (px)

Citation preview

Page 1: Smoke Tests @ DevOps-Hamburg 06.02.2017

SmokeTestsWhy you should try to burn down

your production environment

Comments & Feedback

Page 2: Smoke Tests @ DevOps-Hamburg 06.02.2017

Sebastian ThoßChapter lead Backend

Page 3: Smoke Tests @ DevOps-Hamburg 06.02.2017
Page 4: Smoke Tests @ DevOps-Hamburg 06.02.2017

Disclaimer

Page 5: Smoke Tests @ DevOps-Hamburg 06.02.2017

Agenda• Types Of Tests

• SmokeTests

• Server Architecture

• Questions & Answers

Page 6: Smoke Tests @ DevOps-Hamburg 06.02.2017

Types Of Tests

Page 7: Smoke Tests @ DevOps-Hamburg 06.02.2017

Test Pyramid

UNIT TESTS

Page 8: Smoke Tests @ DevOps-Hamburg 06.02.2017

Class 2

Class 3

Mock

Mock

Unit Tests

Class 1

Class 4

Page 9: Smoke Tests @ DevOps-Hamburg 06.02.2017
Page 10: Smoke Tests @ DevOps-Hamburg 06.02.2017

Test Pyramid

INTEGRATION TESTS

UNIT TESTS

Page 11: Smoke Tests @ DevOps-Hamburg 06.02.2017

Class 3 Class 4Mock Mock

Integration Tests

Class 1 Class 2

Page 12: Smoke Tests @ DevOps-Hamburg 06.02.2017

Test Pyramid

INTEGRATION TESTS

UNIT TESTS

100% CODE COVER

AGE

Page 13: Smoke Tests @ DevOps-Hamburg 06.02.2017

Test Pyramid

ACCEPTANCE TESTS

INTEGRATION TESTS

UNIT TESTS

Page 14: Smoke Tests @ DevOps-Hamburg 06.02.2017

Acceptance Tests

Class 1 Class 2

Class 3 Class 4

Page 15: Smoke Tests @ DevOps-Hamburg 06.02.2017

Test Pyramid

ACCEPTANCE TESTS

INTEGRATION TESTS

UNIT TESTS

?

$$$

¢

Page 16: Smoke Tests @ DevOps-Hamburg 06.02.2017

SmokeTests

Page 17: Smoke Tests @ DevOps-Hamburg 06.02.2017

What are SmokeTests?

In computer programming and software testing, smoke testing is preliminary testing to reveal simple failures severe enough to reject a prospective software release. Source: https://en.wikipedia.org/wiki/Smoke_testing_(software)

Page 18: Smoke Tests @ DevOps-Hamburg 06.02.2017

SmokeTests should…• … be simple

• … be fast

• … test pages with optional parameters too

• … cover at least all URLs in google index

• … use a manual maintained list of URLs

Page 19: Smoke Tests @ DevOps-Hamburg 06.02.2017

How do SmokeTests work?

https://www.my-application.com/foo

<html><body>…</body></html>

TTFB: 65ms

HTTP 1.1/200 OK

SmokeTest Client

CI Server

Application Under Test

Production Server

Page 20: Smoke Tests @ DevOps-Hamburg 06.02.2017

How do SmokeTests work?

https://www.my-application.com/foo

<html><body>…</body></html>

TTFB: 320ms

HTTP 1.1/200 OK

SmokeTest Client

CI Server

Application Under Test

Production Server

Page 21: Smoke Tests @ DevOps-Hamburg 06.02.2017

What should SmokeTests validate?• Correct Server

• Status Code

• Time To First Byte

• If Body Is Provided

Page 22: Smoke Tests @ DevOps-Hamburg 06.02.2017

SmokeTests are NOT Acceptance Tests

SmokeTest Client

HTTP 1.1/200 OK

<html> <head> <title>Foo</title> <body> <div id="bar"><span>foobar</span></div> </body> </html>

Page 23: Smoke Tests @ DevOps-Hamburg 06.02.2017

namespace Kartenmacherei\Testing;

use PHPUnit_Framework_TestCase;

class SmokeTest extends PHPUnit_Framework_TestCase { /** * @dataProvider furyUrlProvider * * @param Url $url */ public function testFuryUrl(Url $url) { $result = $this->sendGetRequest($url);

$this->assertSame(200, $result->getStatusCode()); $this->assertNotEmpty($result->getBody()); $this->assertLessThanOrEqual(100, $result->getTimeToFirstByteInMilliseconds()); }

public function furyUrlProvider() { $urls = ['http://www.kartenmacherei.de', …]; $urlCollection = UrlCollection::fromStrings($urls);

return $urlCollection->asDataProviderArray($urlCollection); }

Page 24: Smoke Tests @ DevOps-Hamburg 06.02.2017

How to speed up SmokeTests?

Page 25: Smoke Tests @ DevOps-Hamburg 06.02.2017

Concurrent SmokeTests

SmokeTest Client

CI Server

Application Under Test

Production Server

https://www.my-application.com/baz

https://www.my-application.com/bar

https://www.my-application.com/foo

Page 26: Smoke Tests @ DevOps-Hamburg 06.02.2017

Concurrent SmokeTests

https://www.my-application.com/bazSmokeTest

Client

CI Server

Application Under Test

Production Server

https://www.my-application.com/bar

https://www.my-application.com/foo

TTFB: 34ms

Page 27: Smoke Tests @ DevOps-Hamburg 06.02.2017

Concurrent SmokeTests

https://www.my-application.com/foobazSmokeTest

Client

CI Server

Application Under Test

Production Server

https://www.my-application.com/bar

https://www.my-application.com/foo

Page 28: Smoke Tests @ DevOps-Hamburg 06.02.2017

Concurrent SmokeTests

SmokeTest Client

CI Server

Application Under Test

Production Server

TTFB: 65ms

https://www.my-application.com/foobaz

https://www.my-application.com/bar

https://www.my-application.com/foo

Page 29: Smoke Tests @ DevOps-Hamburg 06.02.2017

Concurrent SmokeTests

SmokeTest Client

CI Server

Application Under Test

Production Serverhttps://www.my-application.com/123

https://www.my-application.com/foobaz

https://www.my-application.com/bar

Page 30: Smoke Tests @ DevOps-Hamburg 06.02.2017

Concurrent SmokeTests

SmokeTest Client

CI Server

Application Under Test

Production Server

TTFB: 620ms

https://www.my-application.com/123

https://www.my-application.com/foobaz

https://www.my-application.com/bar

Page 31: Smoke Tests @ DevOps-Hamburg 06.02.2017

There is a Lib for SmokeTests

DjThossi/Smoke-Testing-PHP

Page 32: Smoke Tests @ DevOps-Hamburg 06.02.2017

DataProvider

Test

Application

HTTP Requests

HTTP Responses

PHPUnit

Call

Result[]

Result

Page 33: Smoke Tests @ DevOps-Hamburg 06.02.2017

class SmokeTest extends PHPUnit_Framework_TestCase { use SmokeTestTrait;

/** * @dataProvider myDataProvider */ public function testExample(Result $result) { $this->assertSuccess($result); $this->assertTimeToFirstByte(new TimeToFirstByte(100), $result); $this->assertBodyNotEmpty($result); $this->assertHeaderExists(Header::fromPrimitives(‘App-Server', ‘Fury’), $result); }

public function myDataProvider() { $urls = ['http://www.kartenmacherei.de', …]; $options = new SmokeTestOptions( UrlCollection::fromStrings($urls), new RequestTimeout(2), new FollowRedirects(true), new Concurrency(3), new BodyLength(500) );

return $this->runSmokeTests($options); }

Page 34: Smoke Tests @ DevOps-Hamburg 06.02.2017

Server Architecture

Page 35: Smoke Tests @ DevOps-Hamburg 06.02.2017

Webserver (Router)

Webserver

FURY Frontend

Server A

K/V StoreSearch

FURY Backend

Webserver

FURY Frontend

Server B

K/V StoreSearch

FURY Backend

Page 36: Smoke Tests @ DevOps-Hamburg 06.02.2017

Webserver (Router)

Webserver

FURY Frontend

Server A

K/V StoreSearch

FURY Backend

Webserver

FURY Frontend

Server B

K/V StoreSearch

FURY Backend

active = A

Page 37: Smoke Tests @ DevOps-Hamburg 06.02.2017

Webserver (Router)

Webserver

FURY Frontend

Server A

K/V StoreSearch

FURY Backend

Webserver

FURY Frontend

Server B

K/V StoreSearch

FURY Backend

active = B

Page 38: Smoke Tests @ DevOps-Hamburg 06.02.2017

Webserver (Router)

Webserver

FURY Frontend

Server A

K/V StoreSearch

FURY Backend

active = B

Page 39: Smoke Tests @ DevOps-Hamburg 06.02.2017

RDBMS Read Slave

Webserver

FURY Frontend

Server A

K/V StoreSearch

FURY Backend

Webserver (Router)

Build Server

Deploy Code

active = B

Page 40: Smoke Tests @ DevOps-Hamburg 06.02.2017

RDBMS Read Slave

Webserver

FURY Frontend

Server A

K/V StoreSearch

FURY Backend

Webserver (Router)

Build Server

Deploy Code

Collect & Export

active = B

Page 41: Smoke Tests @ DevOps-Hamburg 06.02.2017

RDBMS Read Slave

Webserver

FURY Frontend

Server A

K/V StoreSearch

FURY Backend

Webserver (Router)

Build Server

Deploy Code

Collect & Export

Smoke Tests

active = B

Page 42: Smoke Tests @ DevOps-Hamburg 06.02.2017

RDBMS Read Slave

Webserver

FURY Frontend

Server A

K/V StoreSearch

FURY Backend

Webserver (Router)

Build Server

Deploy Code

Collect & Export

Smoke Tests

active = B

Page 43: Smoke Tests @ DevOps-Hamburg 06.02.2017

RDBMS Read Slave

Webserver

FURY Frontend

Server A

K/V StoreSearch

FURY Backend

Webserver (Router)

Build Server

Deploy Code

Collect & Export

Smoke Tests

active = B

Page 44: Smoke Tests @ DevOps-Hamburg 06.02.2017

RDBMS Read Slave

Webserver

FURY Frontend

Server A

K/V StoreSearch

FURY Backend

Webserver (Router)

Build Server

Deploy Code

Collect & Export

Smoke Tests

Switch to A

active = Bactive = A

Page 45: Smoke Tests @ DevOps-Hamburg 06.02.2017

Conclusion• Write tests

• Get 100% coverage

• SmokeTest your Website

• Only activate server if it didn't start smoking

Page 46: Smoke Tests @ DevOps-Hamburg 06.02.2017

Q&A

https://www.facebook.com/kartenmacherei/

[email protected]

http://inside.kartenmacherei.de/job.html

https://tech.kartenmacherei.de/

@techdotkam

Comments & Feedback