Smoke testing with Go

Preview:

Citation preview

WITH GOSMOKE TESTING

GO

GO WAS CONCEIVED WHILE WAITING FOR C++ TO COMPILE

it is said that

“BORN OUT OF FRUSTRATION WITH EXISTING LANGUAGES AND

ENVIRONMENTS FOR SYSTEMS PROGRAMMING”

2007

OPEN-SOURCED BY GOOGLE 2009

COMPILED

STATICALLY-TYPED SOMETIMES THE TYPE IS INFERRED FROM THE CONTEXT

FOCUS ON READABILITY AND PERFORMANCE

DESIGNED FOR GOOGLE-SCALE CODEBASES

GARBAGE-COLLECTED

NATIVE CONCURRENCY SUPPORT COROUTINES, CHANNELS

SYNTAX ENFORCES READABILITY NO TERNARY OPERATOR

VAR++ DOES NOT RETURN VALUE

SMART DEPENDENCY LINKING FAST COMPILATION

WHAT DOES IT LOOK LIKE?

GAINING POPULARITY:

TESTING FRAMEWORKS

GINGKO TEST STRUCTURE

▸ Describe()

▸ Context()

▸ It()

▸ By()

▸ Describe()

▸ …

THE USUAL

▸ BeforeSuite()

▸ BeforeEach()

▸ AfterEach()

▸ AfterSuite()

FOCUSED SPECS

▸ FDescribe()

▸ FContext()

▸ FIt()

RUNNING TEST SUITE

go test

MAKING ASSERTIONS

‣ Expect(ACTUAL).To(Equal(EXPECTED))

‣ Expect(ACTUAL).NotTo(Equal(EXPECTED))

‣ Expect(ACTUAL).ToNot(Equal(EXPECTED))

ASSERTING EQUIVALENCE

‣ Equal(...)

‣ BeEquivalentTo(...)

‣ BeAssignableToTypeOf(...)

ASSERTING PRESENCE

‣ BeNil()

‣ BeZero()

ASSERTING TRUTHINESS

‣ BeTrue()

‣ BeFalse()

ASSERTING ON ERRORS

‣ HaveOccurred()

‣ Succeed()

‣ MatchError(...)

MAKING ASYNCHRONOUS ASSERTIONS

▸ Eventually()

▸ Consistently()

EVENTUALLY

Eventually(func() []int {

return thing.SliceImMonitoring

}, TIMEOUT, POLLING_INTERVAL).Should(HaveLen(2))

CONSISTENTLY

Consistently(func() []int {

return thing.MemoryUsage()

}).Should(BeNumerically("<", 10))

PROCESS

‣ Connect to the web driver

‣ Create page object

‣ Find / select elements on the page to interact with

‣ Interact (click, fill in text, submit form, …)

‣ Make assertions about the expected result

‣ Destroy page object

CONNECTING TO THE WEB DRIVER

var err error

capabilities := agouti.NewCapabilities().Browser("firefox").Platform("linux").With("javascriptEnabled")

page, err = agouti.NewPage("http://selenium:4444/wd/hub", agouti.Desired(capabilities))

Expect(err).NotTo(HaveOccurred())

page.Size(1360, 768)

FINDING ELEMENTS

‣ page.First(“#project-toggle")

‣ page.FindByLabel(“Password")

MORE FINDERS

‣ FindByButton(text string) *Selection

‣ FindByLabel(text string) *Selection

‣ FindByLink(text string) *Selection

‣ FindByName(name string) *Selection

‣ FindByXPath(selector string) *Selection

‣ and many more…

THINGS TO DO WITH THE PAGE‣ GetCookies() ([]*http.Cookie, error)

‣ Navigate(url string) error

‣ RunScript(body string, arguments map[string]interface{}, result interface{}) error

‣ Screenshot(filename string) error

‣ SetCookie(cookie *http.Cookie) error

‣ Size(width, height int) error

‣ and so on…

THINGS TO DO WITH THE SELECTION

‣ Check() error

‣ Click() error

‣ Fill(text string) error

‣ Submit() error

‣ UploadFile(filename string) error

‣ FlickFinger(xOffset, yOffset int, speed uint) error

‣ and so on…

OUR SETUP

DOCKER COMPOSE

SELENIUM

HEADLESS FIREFOX

GO RUNTIME

LIBRARIES

TEST SUITE

CAMATO

ENVIRONMENT VARIABLES

‣ ENV: {staging, review, integration, www}

‣ which server to test against

‣ SCREENSHOT: {yes, no}

‣ whether or not to record screenshots

IN DOCKER-COMPOSE.YML

kitten:

<<: *smoketests

command: go test -test.timeout 15m -ginkgo.progress -ginkgo.v -ginkgo.focus Kitten

campaign_management:

<<: *smoketests

command: go test -test.timeout 15m -ginkgo.progress -ginkgo.v -ginkgo.focus Campaign

FROM THE COMMAND LINE

docker-compose run -e ENV=staging -e SCREENSHOT=yes all

docker-compose run -e ENV=staging -e SCREENSHOT=yes kitten

docker-compose run -e ENV=staging -e SCREENSHOT=yes campaign_management

DEMO

THANKS!

Recommended