Top Banner
DIY (Do-it-yourself) Testing
57

RubyKaigi 2015-DIY-Testing

Apr 14, 2017

Download

Software

Emily Stolfo
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: RubyKaigi 2015-DIY-Testing

DIY (Do-it-yourself)

Testing

Page 2: RubyKaigi 2015-DIY-Testing

Ruby Engineer on the drivers team.

Based in Berlin.Maintain the gems:

bson mongo mongoid bson_ext mongo_kerberos

@EmStolfo

Page 3: RubyKaigi 2015-DIY-Testing

MongoDB DriversC C++ C# Java Node.js Perl PHP Python Ruby Scala

Page 4: RubyKaigi 2015-DIY-Testing

MongoDB Drivers

Interface to the server.

10 official drivers available.

Many started as OS projects.

History

Page 5: RubyKaigi 2015-DIY-Testing

No specifications.Divergent codebases

and features.

MongoDB DriversReality

Page 6: RubyKaigi 2015-DIY-Testing

Server “interface” was not consistent.

MongoDB DriversReality

Page 7: RubyKaigi 2015-DIY-Testing

Organizations can experience 1 interface.

Specifications guide design and provide documentation.

Rewrites with collective knowledge.

MongoDB DriversRevamp

Page 8: RubyKaigi 2015-DIY-Testing

Server “interface” is a single product.

MongoDB DriversRevamp

Page 9: RubyKaigi 2015-DIY-Testing

Specifications

Equally valuable to the drivers team as to the community.

Page 10: RubyKaigi 2015-DIY-Testing

Server Discovery and Monitoring Spec

Logic required to make an application using MongoDB highly available.

Page 11: RubyKaigi 2015-DIY-Testing

How to validate compliance?

Page 12: RubyKaigi 2015-DIY-Testing

Requirements for validating compliance• Unit tests. • Integration tests. • Tests define as “data”. • Language-agnostic. • Reproducible scenarios.

Page 13: RubyKaigi 2015-DIY-Testing

DIY Testing

Our custom tests: Unit / Integration Build your own test framework.

Page 14: RubyKaigi 2015-DIY-Testing

define

Format - YAML Tests

Scenarios

Our approach:“DIY” testing

Page 15: RubyKaigi 2015-DIY-Testing

benefitsFormat: YAML

• Describes data. • Can translate to actions. • Most languages can use a YAML parsing

library. • Driver authors write a reusable harness. • Changes in the spec can be

communicated via additional YAML tests or changes to existing ones.

Page 16: RubyKaigi 2015-DIY-Testing

Test requirements• Unit tests. • Integration tests. • Defined as “data”. • Language-agnostic. • Reproducible scenarios.

Page 17: RubyKaigi 2015-DIY-Testing

Unit test - YAMLsingle/direct_connection_standalone.yml

Page 18: RubyKaigi 2015-DIY-Testing

Unit test - Test objectspec/support/server_discovery_and_monitoring.rb

Page 19: RubyKaigi 2015-DIY-Testing

Unit test - specspec/mongo/server_discovery_and_monitoring_spec.rb

Page 20: RubyKaigi 2015-DIY-Testing

Unit test - YAMLrs/discover_primary.yml

Page 21: RubyKaigi 2015-DIY-Testing

Test requirements• Unit tests. • Integration tests. • Defined as “data”. • Language-agnostic. • Reproducible scenarios.

Mongo Orchestration

Page 22: RubyKaigi 2015-DIY-Testing

Mongo Orchestration

Page 23: RubyKaigi 2015-DIY-Testing

Define clusters using JSON.Manipulate clusters via RESTful API.

Mongo OrchestrationHTTP server providing REST interface to manage

multiple MongoDB processes on the same machine.

Implemented in python.

Page 24: RubyKaigi 2015-DIY-Testing

What about Automation!?

• Is intended for testing. • Starts processes on one machine. • Allows fault injection. • Does not have a UI. • Has no protection against downtime. • Has one agent, so no resiliency. • Does not handle operation tasks.

Mongo Orchestration..!

Page 25: RubyKaigi 2015-DIY-Testing

Create different cluster topologies.

Single

Mongo Orchestration

Replica Set

Sharded Cluster

Page 26: RubyKaigi 2015-DIY-Testing

Setup

Page 27: RubyKaigi 2015-DIY-Testing

Single serverconfig options

Page 28: RubyKaigi 2015-DIY-Testing

Replica Setconfig options

Page 29: RubyKaigi 2015-DIY-Testing

Sharded Clusterconfig options

Page 30: RubyKaigi 2015-DIY-Testing

Define different installations in a config file

mongo-orchestration.config

Page 31: RubyKaigi 2015-DIY-Testing

Set up a Replica Sethttp://bit.ly/mo-usage

Page 32: RubyKaigi 2015-DIY-Testing

Benefits of MO• Reproducible test scenarios. • Abstracts differing configuration

options across MongoDB versions. • Uniform interface regardless of OS. • Ability to define different locations

of MongoDB installations for multi-version testing.

Page 33: RubyKaigi 2015-DIY-Testing

Multi-version testingMulti-topology testing

SSLAuthentication

Used internally

Drivers integration tests

Page 34: RubyKaigi 2015-DIY-Testing

No need for cluster managerstest/tools/mongo_config.rb(cluster manager in 1.x ruby driver)

Page 35: RubyKaigi 2015-DIY-Testing

Jenkins testing

Page 36: RubyKaigi 2015-DIY-Testing

Integration tests

Page 37: RubyKaigi 2015-DIY-Testing

Integration testsTest driver behavior. Input: cluster state

Output: driver behavior

Mongo Orchestration

Page 38: RubyKaigi 2015-DIY-Testing

Test harness (Ruby driver example)

PR #584 [WIP] Integration tests using Mongo Orchestration

Page 39: RubyKaigi 2015-DIY-Testing

YAML integration testrs/connection/primary-not-available.yml (I)

Page 40: RubyKaigi 2015-DIY-Testing

YAML integration testrs/connection/primary-not-available.yml (II)

Page 41: RubyKaigi 2015-DIY-Testing

Harness structure

1. Resource (MO cluster) 2. Specification (parsed YAML) 3. Test (can be run)

PR #584 [WIP] Integration tests using Mongo Orchestration

Page 42: RubyKaigi 2015-DIY-Testing

Resourcespec/support/mongo_orchestration/resource.rb

Page 43: RubyKaigi 2015-DIY-Testing

Specificationspec/support/mongo_orchestration/spec.rb

Page 44: RubyKaigi 2015-DIY-Testing

Testspec/support/mongo_orchestration/operation/client_operation.rb

Page 45: RubyKaigi 2015-DIY-Testing

Restarted primary integration testrs/connection/primary-restarted.yml (I)

Page 46: RubyKaigi 2015-DIY-Testing

Restarted primary integration testrs/connection/primary-restarted.yml (II)

Page 47: RubyKaigi 2015-DIY-Testing

Restarted primary integration testrs/connection/primary-restarted.yml (III)

Page 48: RubyKaigi 2015-DIY-Testing

How to build your own testing framework

Page 49: RubyKaigi 2015-DIY-Testing

Ask yourself1. Unit or integration tests? 2. Need to be language-agnostic? 3. Directly related to specs or

documentation?

Page 50: RubyKaigi 2015-DIY-Testing

Test framework entities

Resource Wrapper around

the external component.

Page 51: RubyKaigi 2015-DIY-Testing

Test framework entities

Specification The parsed YAML.

Page 52: RubyKaigi 2015-DIY-Testing

Test framework entities

State manipulator Processor of phases to get

to a certain state.

Page 53: RubyKaigi 2015-DIY-Testing

Test framework entities

Tests Can be executed.

Result is ‘pass’ or ‘fail’.

Page 54: RubyKaigi 2015-DIY-Testing

Make the test runner as generic as possible.

Page 55: RubyKaigi 2015-DIY-Testing

Install Mongo Orchestration

Page 56: RubyKaigi 2015-DIY-Testing
Page 57: RubyKaigi 2015-DIY-Testing

Resources

http://bit.ly/ruby-kaigi-diy-testing@EmStolfo