Test Driven Development - TDD and Unit Testing in Scala - XenonStack

Overview

With the evolutionary growth of the software development process, Test Driven Development is an approach that consolidates test first driven methodology and refactoring.

Test Driven Development is a key practice for extreme programming, it suggests that the code is developed or changed exclusively on the basis of the Unit Testing.


TDD (Test Driven Development)

It is a practice of writing a (failing) test prior to writing the code of a feature. Feature code is refined until it passes the unit test.

Steps for the same are given below –

  • Firstly, add a test.
  • Run all the tests and see if any new test fails.
  • Update the code to make it pass the new tests.
  • Run the test again and if they fail then refactor again and repeat.

Test Driven Development Approach


BDD (Behaviour Driven Development)

Behaviour Driven Development (BDD) is similar to the Test Driven Development. In other words, Behaviour Driven Development is the extended version of Test Driven Development.

The process is similar to Test Driven Development. In this also, the code is first written in Behaviour Driven Development and the production code. But, the main difference is that in Behaviour Driven Development the test is written in plain descriptive English type grammar as opposed to Test Driven Development.

This type of development –

  • Explained the behaviour of the software/program.
  • User friendly

The major benefit of Behaviour Driven Development is that it can easily be understood by a non-technical person also.


What is Unit Testing?

Unit tests operate on a low level and are tightly coupled with source code. In the best of worlds, one unit test always correlates to one minimal piece of functionality. These functionalities are independent of the other components of the code


What is Integration Testing?

Integration tests validate that software components work correctly when combined together. Only the interfaces between components are tested and it is assumed that each component has been individually unit tested.


Test Driven Development Workflow

Test Driven Development promotes the idea of each test case testing one piece of functionality at a time. The workflow of Test Driven Development is as follows –

  • Write a concise, minimal test for a new piece of functionality. This test will fail since the functionality isn’t implemented yet (if it passes one knows that the functionality either already exists or that the test isn’t designed correctly).
  • Implement the new functionality and run all tests, both the new and pre-existing ones. Repeat until all tests pass.
  • Clean up the code and ensure that all tests still pass, then return to step 1.

Core Overview to Test Driven Development


Test First Development in Agile

  • For this programming approach we write the tests before programming and during testing for functionality, all these test cases are run whenever we test the functionality.
  • For test first programming we can also say that we are going to write the automated test cases before the functionality and the developer has to write the test case to satisfy these tests cases.

Test Driven Development

It is the practice of first writing a (failing) test prior to writing the code for a feature. Feature code is refined until it passes tests(s).

  • Firstly when we go to design or implement a new feature we check whether an existing design is the best design which will help us to implement a new functionality.
  • If the above condition satisfies then we follow the TFD approach for the implementation of new functionality.

If the above condition is not satisfied, then it allows us to change the portion of design affected by new functionality and allows us to add new features very easily.

You May also Love to Read Test Driven Development in Java


Need For Test Driven Development

  • Ensures quality – It helps in ensuring the quality by focusing on requirements before writing the code.
  • Keeps code neat and tidy – It assists in keeping the code clear, simple and testable by breaking it down into small achievable steps.
  • Maintains Documentation – It provides documentation about how the system works for anyone coming into the team later.
  • Repeatable Test and rapid change – It builds a suite of repeatable regression tests and acts as an enabler for rapid change.

TDD Life Cycle

  • Firstly, we write the test cases.
  • Then we run these test cases with functionality.
  • Next, changes are made to the functionality if the test is not satisfied.
  • The whole process written above is repeated until the test cases are not satisfied by functionality.

Test Driven Development with Scala

Scala is a programming language which combines both object-oriented and functional programming paradigms. Considering functional aspects of Scala we can define functions of two types –

  • Functions that perform computation and no I/O operations –
    • In general, the developer must focus on writing functions which are free of side effects.
    • If the function does have side effects, those should not affect the results of subsequent tests.
  • Functions that perform I/O operations and no computation –
    • If a function performs less computation and more IO operations, one must consider specific testing frameworks for writing test for such functions. For example, there is no need to use ScalaTest (a popular testing framework) for such functions.

In scala, tests reside in project source but separated from the application code. There are many many testing frameworks available with a lot of features, one can choose according to the specific features in the framework. We will consider ScalaTest, a popular testing framework, in this document.


TDD Style Unit Tests with ScalaTest

ScalaTest is a testing framework inspired by JUnit. ScalaTest supports different styles of writing test, each designed to address specific needs.

Some of the testing styles include –

Every member of the team is supposed to follow the same chosen style.

Scala test recommends FlatSpec for the unit and integration testing and FeatureSpec for acceptance testing.


Setting Up Environment For TDD

Perform the following steps –

  • Setup directory structure of your project as given below –

	|-- build.sbt
|-- lib
|-- project
|-- src
|   |-- main
|   |   |-- java
|   |   |-- resources
|   |   |-- scala
|   |-- test
|       |-- java
|       |-- resources
|       |-- scala
|-- target
  • Include ScalaTest in your sbt project by simply adding the following line: libraryDependencies += “org.scalatest” % “scalatest_2.12” % “3.0.4” % “test”

Implementing Test Driven Development

  • Write a test using the FlatSpec style –

import org.scalatest.FlatSpec
class PizzaTests extends FlatSpec {
 val pizza = new Pizza "A new pizza"
 should "have zero toppings" in {
  assert(pizza.getToppings.size == 0)
 }
 "A pizza"
 should "have one topping" in {
  pizza.addTopping(Topping("green olives"))
  assert(pizza.getToppings.size === 1)
 }
 it must "get pizza pricing"
 is(pending)
}
  • Write just enough code to fail the test

class Pizza {
 private val toppings = new ArrayBuffer[Topping]
 def addTopping(t: Topping) {}
 def removeTopping(t: Topping) {}
 def getToppings = toppings.toList
}
  • Execute the “sbt test” command in the project structure –

Output

Test Output For Test Driven Development

  • Refactor the code

import scala.collection.mutable.ArrayBuffer
case class Topping(name: String)
class Pizza {
 private val toppings = new ArrayBuffer[Topping]
 def addTopping(t: Topping) {
  toppings += t
 }
 def removeTopping(t: Topping) {
  toppings -= t
 }
 def getToppings = toppings.toList
}
  • Execute “sbt run”

Output –

Executing Test Command For TDD


Holistic Strategy Towards TDD

Test-driven development (TDD) is a development technique where the developer must first write a test that fails before one writes a new functional code. TDD ensures a proven way to ensure effective unit testing however it does not replace traditional testing.

We believe that TDD is an incredible practice that all software developers should consider during the development process. If you want to dive into test-driven development techniques, you are advised to look into the below steps:

 

 

 



Leave a Comment

Name required.
Enter a Valid Email Address.
Comment required.(Min 30 Char)

[wpforms id="7646"]
<div class="wpforms-container wpforms-container-full optin-monster-forms" id="wpforms-7646"><form id="wpforms-form-7646" class="wpforms-validate wpforms-form" data-formid="7646" method="post" enctype="multipart/form-data" action="/blog/test-driven-development/"><noscript class="wpforms-error-noscript">Please enable JavaScript in your browser to complete this form.</noscript><div class="wpforms-page-indicator progress" data-indicator="progress" data-indicator-color="#72b239" data-scroll="1"><span class="wpforms-page-indicator-page-title" ></span><span class="wpforms-page-indicator-page-title-sep" style="display:none;"> - </span><span class="wpforms-page-indicator-steps">Step <span class="wpforms-page-indicator-steps-current">1</span> of 3</span><div class="wpforms-page-indicator-page-progress-wrap"><div class="wpforms-page-indicator-page-progress" style="width:33.333333333333%;background-color:#72b239;"></div></div></div><div class="wpforms-field-container"><div class="wpforms-page wpforms-page-1 "><div id="wpforms-7646-field_10-container" class="wpforms-field wpforms-field-pagebreak" data-field-id="10"></div><div id="wpforms-7646-field_24-container" class="wpforms-field wpforms-field-html form-popup-header-wrapper" data-field-id="24"><div id="wpforms-7646-field_24"><div class="form-popup-header"> <h2>Contact Us<span>!</span></h2> <p>Digitally Transform your Organization with <strong>XenonStack</strong><p> </div></div></div><div id="wpforms-7646-field_21-container" class="wpforms-field wpforms-field-radio custom-radio-btn-wrapper wpforms-list-2-columns wpforms-conditional-trigger" data-field-id="21"><label class="wpforms-field-label wpforms-label-hide" for="wpforms-7646-field_21">Sevices <span class="wpforms-required-label">*</span></label><ul id="wpforms-7646-field_21" class="wpforms-field-required wpforms-image-choices wpforms-image-choices-modern"><li class="choice-1 depth-1 wpforms-image-choices-item"><label class="wpforms-field-label-inline" for="wpforms-7646-field_21_1" tabindex="0"><span class="wpforms-image-choices-image"><img src="https://www.xenonstack.com/wp-content/uploads/2020/06/application-modernisation-popup-option-e1593153816141.png" alt="Application Modernisation " title="Application Modernisation "></span><input type="radio" id="wpforms-7646-field_21_1" class="wpforms-screen-reader-element" name="wpforms[fields][21]" value="Application Modernisation " tabindex="-1" required ><span class="wpforms-image-choices-label">Application Modernisation </span></label></li><li class="choice-2 depth-1 wpforms-image-choices-item"><label class="wpforms-field-label-inline" for="wpforms-7646-field_21_2" tabindex="0"><span class="wpforms-image-choices-image"><img src="https://www.xenonstack.com/wp-content/uploads/2020/06/bigdata-analytics-popup-option-e1593153889151.png" alt="Big Data Analytics" title="Big Data Analytics"></span><input type="radio" id="wpforms-7646-field_21_2" class="wpforms-screen-reader-element" name="wpforms[fields][21]" value="Big Data Analytics" tabindex="-1" required ><span class="wpforms-image-choices-label">Big Data Analytics</span></label></li><li class="choice-3 depth-1 wpforms-image-choices-item"><label class="wpforms-field-label-inline" for="wpforms-7646-field_21_3" tabindex="0"><span class="wpforms-image-choices-image"><img src="https://www.xenonstack.com/wp-content/uploads/2020/06/cloud-migrations-popup-option-e1593153901704.png" alt="Cloud Migrations" title="Cloud Migrations"></span><input type="radio" id="wpforms-7646-field_21_3" class="wpforms-screen-reader-element" name="wpforms[fields][21]" value="Cloud Migrations" tabindex="-1" required ><span class="wpforms-image-choices-label">Cloud Migrations</span></label></li><li class="choice-4 depth-1 wpforms-image-choices-item"><label class="wpforms-field-label-inline" for="wpforms-7646-field_21_4" tabindex="0"><span class="wpforms-image-choices-image"><img src="https://www.xenonstack.com/wp-content/uploads/2020/06/data-visualization-popup-option-e1593153911839.png" alt="Data Visualization" title="Data Visualization"></span><input type="radio" id="wpforms-7646-field_21_4" class="wpforms-screen-reader-element" name="wpforms[fields][21]" value="Data Visualization" tabindex="-1" required ><span class="wpforms-image-choices-label">Data Visualization</span></label></li><li class="choice-5 depth-1 wpforms-image-choices-item"><label class="wpforms-field-label-inline" for="wpforms-7646-field_21_5" tabindex="0"><span class="wpforms-image-choices-image"><img src="https://www.xenonstack.com/wp-content/uploads/2020/06/robotic-process-automation-popup-option-e1593153919805.png" alt="Robotic Process Automation" title="Robotic Process Automation"></span><input type="radio" id="wpforms-7646-field_21_5" class="wpforms-screen-reader-element" name="wpforms[fields][21]" value="Robotic Process Automation" tabindex="-1" required ><span class="wpforms-image-choices-label">Robotic Process Automation</span></label></li></ul></div><div id="wpforms-7646-field_23-container" class="wpforms-field wpforms-field-pagebreak" data-field-id="23"><div class="wpforms-clear wpforms-pagebreak-left"><button class="wpforms-page-button wpforms-page-next" data-action="next" data-page="1" data-formid="7646">Next</button></div></div></div><div class="wpforms-page wpforms-page-2 " style="display:none;"><div id="wpforms-7646-field_25-container" class="wpforms-field wpforms-field-html form-popup-header-wrapper" data-field-id="25"><div id="wpforms-7646-field_25"><div class="form-popup-header"> <h2>How can we get in Touch</h2> <p>Fill the form and we will revert back to you soon.<p> </div></div></div><div id="wpforms-7646-field_20-container" class="wpforms-field wpforms-field-name col-12 col-sm-10 col-md-8 form-group" data-field-id="20"><label class="wpforms-field-label" for="wpforms-7646-field_20">Name <span class="wpforms-required-label">*</span></label><input type="text" id="wpforms-7646-field_20" class="wpforms-field-large wpforms-field-required" name="wpforms[fields][20]" placeholder="Name" required></div><div id="wpforms-7646-field_2-container" class="wpforms-field wpforms-field-email col-12 col-sm-10 col-md-8 form-group" data-field-id="2"><label class="wpforms-field-label" for="wpforms-7646-field_2">Email <span class="wpforms-required-label">*</span></label><input type="email" id="wpforms-7646-field_2" class="wpforms-field-large wpforms-field-required" name="wpforms[fields][2]" placeholder="Email" required></div><div id="wpforms-7646-field_3-container" class="wpforms-field wpforms-field-text col-12 col-sm-10 col-md-8 form-group" data-field-id="3"><label class="wpforms-field-label" for="wpforms-7646-field_3">Organization <span class="wpforms-required-label">*</span></label><input type="text" id="wpforms-7646-field_3" class="wpforms-field-large wpforms-field-required" name="wpforms[fields][3]" placeholder="Organization" required></div><div id="wpforms-7646-field_12-container" class="wpforms-field wpforms-field-pagebreak next-btn-wrapper" data-field-id="12"><div class="wpforms-clear wpforms-pagebreak-left"><button class="wpforms-page-button wpforms-page-next" data-action="next" data-page="2" data-formid="7646">Next</button></div></div></div><div class="wpforms-page wpforms-page-3 last next-btn-wrapper" style="display:none;"><div id="wpforms-7646-field_34-container" class="wpforms-field wpforms-field-html form-popup-header-wrapper" data-field-id="34"><div id="wpforms-7646-field_34"><div class="form-popup-header"> <h2>Share Your Requirements</h2> </div></div></div><div id="wpforms-7646-field_7-container" class="wpforms-field wpforms-field-checkbox col-12 col-sm-12 col-md-12 custom-checkbox form-group wpforms-list-2-columns wpforms-conditional-field wpforms-conditional-show" data-field-id="7" style="display:none;"><label class="wpforms-field-label" for="wpforms-7646-field_7">Application Modernization Services <span class="wpforms-required-label">*</span></label><ul id="wpforms-7646-field_7" class="wpforms-field-required"><li class="choice-1 depth-1"><input type="checkbox" id="wpforms-7646-field_7_1" name="wpforms[fields][7][]" value="Application Re-platform " required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_7_1">Application Re-platform </label></li><li class="choice-2 depth-1"><input type="checkbox" id="wpforms-7646-field_7_2" name="wpforms[fields][7][]" value="Application Migration " required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_7_2">Application Migration </label></li><li class="choice-3 depth-1"><input type="checkbox" id="wpforms-7646-field_7_3" name="wpforms[fields][7][]" value="Cloud Native Transformation" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_7_3">Cloud Native Transformation</label></li><li class="choice-4 depth-1"><input type="checkbox" id="wpforms-7646-field_7_4" name="wpforms[fields][7][]" value="Application Assessment" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_7_4">Application Assessment</label></li><li class="choice-5 depth-1"><input type="checkbox" id="wpforms-7646-field_7_5" name="wpforms[fields][7][]" value="Application Re-engineering" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_7_5">Application Re-engineering</label></li></ul></div><div id="wpforms-7646-field_28-container" class="wpforms-field wpforms-field-checkbox col-12 col-sm-12 col-md-12 custom-checkbox form-group wpforms-list-2-columns wpforms-conditional-field wpforms-conditional-show" data-field-id="28" style="display:none;"><label class="wpforms-field-label" for="wpforms-7646-field_28">Data Visualization Services <span class="wpforms-required-label">*</span></label><ul id="wpforms-7646-field_28" class="wpforms-field-required" data-choice-limit="1"><li class="choice-1 depth-1"><input type="checkbox" id="wpforms-7646-field_28_1" data-rule-check-limit="true" name="wpforms[fields][28][]" value="Data Visualization Cloud Services" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_28_1">Data Visualization Cloud Services</label></li><li class="choice-2 depth-1"><input type="checkbox" id="wpforms-7646-field_28_2" data-rule-check-limit="true" name="wpforms[fields][28][]" value="Dashboard and User Experience Design" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_28_2">Dashboard and User Experience Design</label></li><li class="choice-3 depth-1"><input type="checkbox" id="wpforms-7646-field_28_3" data-rule-check-limit="true" name="wpforms[fields][28][]" value="Data Visualization Integration " required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_28_3">Data Visualization Integration </label></li><li class="choice-4 depth-1"><input type="checkbox" id="wpforms-7646-field_28_4" data-rule-check-limit="true" name="wpforms[fields][28][]" value="Analytics and Reporting Solutions " required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_28_4">Analytics and Reporting Solutions </label></li></ul></div><div id="wpforms-7646-field_35-container" class="wpforms-field wpforms-field-checkbox col-12 col-sm-12 col-md-12 custom-checkbox form-group wpforms-list-2-columns wpforms-conditional-field wpforms-conditional-show" data-field-id="35" style="display:none;"><label class="wpforms-field-label" for="wpforms-7646-field_35">Data Visualization Tools <span class="wpforms-required-label">*</span></label><ul id="wpforms-7646-field_35" class="wpforms-field-required" data-choice-limit="1"><li class="choice-1 depth-1"><input type="checkbox" id="wpforms-7646-field_35_1" data-rule-check-limit="true" name="wpforms[fields][35][]" value="Microsoft Power BI" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_35_1">Microsoft Power BI</label></li><li class="choice-2 depth-1"><input type="checkbox" id="wpforms-7646-field_35_2" data-rule-check-limit="true" name="wpforms[fields][35][]" value="Amazon QuickSight" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_35_2">Amazon QuickSight</label></li><li class="choice-3 depth-1"><input type="checkbox" id="wpforms-7646-field_35_3" data-rule-check-limit="true" name="wpforms[fields][35][]" value="Google Data Studio" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_35_3">Google Data Studio</label></li><li class="choice-4 depth-1"><input type="checkbox" id="wpforms-7646-field_35_4" data-rule-check-limit="true" name="wpforms[fields][35][]" value="Tableau" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_35_4">Tableau</label></li></ul></div><div id="wpforms-7646-field_29-container" class="wpforms-field wpforms-field-checkbox col-12 col-sm-12 col-md-12 custom-checkbox form-group wpforms-list-2-columns wpforms-conditional-field wpforms-conditional-show" data-field-id="29" style="display:none;"><label class="wpforms-field-label" for="wpforms-7646-field_29">Big Data Services <span class="wpforms-required-label">*</span></label><ul id="wpforms-7646-field_29" class="wpforms-field-required"><li class="choice-1 depth-1"><input type="checkbox" id="wpforms-7646-field_29_1" name="wpforms[fields][29][]" value="Modern Data Integration " required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_29_1">Modern Data Integration </label></li><li class="choice-2 depth-1"><input type="checkbox" id="wpforms-7646-field_29_2" name="wpforms[fields][29][]" value="Big Data Governance and Security" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_29_2">Big Data Governance and Security</label></li><li class="choice-3 depth-1"><input type="checkbox" id="wpforms-7646-field_29_3" name="wpforms[fields][29][]" value="Enterprise Data Strategy" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_29_3">Enterprise Data Strategy</label></li><li class="choice-4 depth-1"><input type="checkbox" id="wpforms-7646-field_29_4" name="wpforms[fields][29][]" value="Data Catalog" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_29_4">Data Catalog</label></li><li class="choice-5 depth-1"><input type="checkbox" id="wpforms-7646-field_29_5" name="wpforms[fields][29][]" value="Data Discovery " required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_29_5">Data Discovery </label></li></ul></div><div id="wpforms-7646-field_8-container" class="wpforms-field wpforms-field-checkbox col-12 col-sm-12 col-md-12 custom-checkbox form-group wpforms-list-2-columns wpforms-conditional-field wpforms-conditional-show" data-field-id="8" style="display:none;"><label class="wpforms-field-label" for="wpforms-7646-field_8">Data Ingestion Tools <span class="wpforms-required-label">*</span></label><ul id="wpforms-7646-field_8" class="wpforms-field-required"><li class="choice-1 depth-1"><input type="checkbox" id="wpforms-7646-field_8_1" name="wpforms[fields][8][]" value="Amazon Kinesis" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_8_1">Amazon Kinesis</label></li><li class="choice-2 depth-1"><input type="checkbox" id="wpforms-7646-field_8_2" name="wpforms[fields][8][]" value="Apache Kafka" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_8_2">Apache Kafka</label></li><li class="choice-3 depth-1"><input type="checkbox" id="wpforms-7646-field_8_3" name="wpforms[fields][8][]" value="Google Pub/Sub" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_8_3">Google Pub/Sub</label></li><li class="choice-4 depth-1"><input type="checkbox" id="wpforms-7646-field_8_4" name="wpforms[fields][8][]" value="Apache Pulsar" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_8_4">Apache Pulsar</label></li></ul></div><div id="wpforms-7646-field_30-container" class="wpforms-field wpforms-field-checkbox col-12 col-sm-12 col-md-12 custom-checkbox form-group wpforms-list-2-columns wpforms-conditional-field wpforms-conditional-show" data-field-id="30" style="display:none;"><label class="wpforms-field-label" for="wpforms-7646-field_30">Data Processing Tools <span class="wpforms-required-label">*</span></label><ul id="wpforms-7646-field_30" class="wpforms-field-required"><li class="choice-1 depth-1"><input type="checkbox" id="wpforms-7646-field_30_1" name="wpforms[fields][30][]" value="Apache Spark" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_30_1">Apache Spark</label></li><li class="choice-2 depth-1"><input type="checkbox" id="wpforms-7646-field_30_2" name="wpforms[fields][30][]" value="Apache Flink" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_30_2">Apache Flink</label></li><li class="choice-3 depth-1"><input type="checkbox" id="wpforms-7646-field_30_3" name="wpforms[fields][30][]" value="Apache Beam" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_30_3">Apache Beam</label></li><li class="choice-4 depth-1"><input type="checkbox" id="wpforms-7646-field_30_4" name="wpforms[fields][30][]" value="Amazon EMR" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_30_4">Amazon EMR</label></li><li class="choice-6 depth-1"><input type="checkbox" id="wpforms-7646-field_30_6" name="wpforms[fields][30][]" value="Google Cloud Dataproc" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_30_6">Google Cloud Dataproc</label></li></ul></div><div id="wpforms-7646-field_31-container" class="wpforms-field wpforms-field-checkbox col-12 col-sm-12 col-md-12 custom-checkbox form-group wpforms-list-2-columns wpforms-conditional-field wpforms-conditional-show" data-field-id="31" style="display:none;"><label class="wpforms-field-label" for="wpforms-7646-field_31">Cloud Services <span class="wpforms-required-label">*</span></label><ul id="wpforms-7646-field_31" class="wpforms-field-required"><li class="choice-1 depth-1"><input type="checkbox" id="wpforms-7646-field_31_1" name="wpforms[fields][31][]" value="Cloud Governance and Security" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_31_1">Cloud Governance and Security</label></li><li class="choice-2 depth-1"><input type="checkbox" id="wpforms-7646-field_31_2" name="wpforms[fields][31][]" value="Cloud Native Microservices" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_31_2">Cloud Native Microservices</label></li><li class="choice-3 depth-1"><input type="checkbox" id="wpforms-7646-field_31_3" name="wpforms[fields][31][]" value="Cloud Infrastructure Automation" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_31_3">Cloud Infrastructure Automation</label></li><li class="choice-4 depth-1"><input type="checkbox" id="wpforms-7646-field_31_4" name="wpforms[fields][31][]" value="Managed Cloud Services" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_31_4">Managed Cloud Services</label></li><li class="choice-5 depth-1"><input type="checkbox" id="wpforms-7646-field_31_5" name="wpforms[fields][31][]" value="Cloud Data Migration" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_31_5">Cloud Data Migration</label></li></ul></div><div id="wpforms-7646-field_32-container" class="wpforms-field wpforms-field-checkbox col-12 col-sm-12 col-md-12 custom-checkbox form-group wpforms-list-2-columns wpforms-conditional-field wpforms-conditional-show" data-field-id="32" style="display:none;"><label class="wpforms-field-label" for="wpforms-7646-field_32">IT Infrastructure <span class="wpforms-required-label">*</span></label><ul id="wpforms-7646-field_32" class="wpforms-field-required"><li class="choice-1 depth-1"><input type="checkbox" id="wpforms-7646-field_32_1" name="wpforms[fields][32][]" value="AWS" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_32_1">AWS</label></li><li class="choice-2 depth-1"><input type="checkbox" id="wpforms-7646-field_32_2" name="wpforms[fields][32][]" value="Google" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_32_2">Google</label></li><li class="choice-3 depth-1"><input type="checkbox" id="wpforms-7646-field_32_3" name="wpforms[fields][32][]" value="Azure" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_32_3">Azure</label></li><li class="choice-4 depth-1"><input type="checkbox" id="wpforms-7646-field_32_4" name="wpforms[fields][32][]" value="Private Cloud" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_32_4">Private Cloud</label></li><li class="choice-6 depth-1"><input type="checkbox" id="wpforms-7646-field_32_6" name="wpforms[fields][32][]" value="Data Center" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_32_6">Data Center</label></li></ul></div><div id="wpforms-7646-field_33-container" class="wpforms-field wpforms-field-checkbox col-12 col-sm-12 col-md-12 custom-checkbox form-group wpforms-list-2-columns wpforms-conditional-field wpforms-conditional-show" data-field-id="33" style="display:none;"><label class="wpforms-field-label" for="wpforms-7646-field_33">AI Services <span class="wpforms-required-label">*</span></label><ul id="wpforms-7646-field_33" class="wpforms-field-required"><li class="choice-1 depth-1"><input type="checkbox" id="wpforms-7646-field_33_1" name="wpforms[fields][33][]" value="Computer Vision Services" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_33_1">Computer Vision Services</label></li><li class="choice-2 depth-1"><input type="checkbox" id="wpforms-7646-field_33_2" name="wpforms[fields][33][]" value="Robotic Process Automation" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_33_2">Robotic Process Automation</label></li><li class="choice-3 depth-1"><input type="checkbox" id="wpforms-7646-field_33_3" name="wpforms[fields][33][]" value="Enterprise Operational Analytics" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_33_3">Enterprise Operational Analytics</label></li><li class="choice-4 depth-1"><input type="checkbox" id="wpforms-7646-field_33_4" name="wpforms[fields][33][]" value="AI Based Development" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_33_4">AI Based Development</label></li><li class="choice-5 depth-1"><input type="checkbox" id="wpforms-7646-field_33_5" name="wpforms[fields][33][]" value="AI Strategy Consulting " required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_33_5">AI Strategy Consulting </label></li></ul></div><div id="wpforms-7646-field_36-container" class="wpforms-field wpforms-field-checkbox col-12 col-sm-12 col-md-12 custom-checkbox form-group wpforms-list-2-columns wpforms-conditional-field wpforms-conditional-show" data-field-id="36" style="display:none;"><label class="wpforms-field-label" for="wpforms-7646-field_36">Robotic Process Automation Platform</label><ul id="wpforms-7646-field_36"><li class="choice-2 depth-1"><input type="checkbox" id="wpforms-7646-field_36_2" name="wpforms[fields][36][]" value="Blue Prism " ><label class="wpforms-field-label-inline" for="wpforms-7646-field_36_2">Blue Prism </label></li><li class="choice-4 depth-1"><input type="checkbox" id="wpforms-7646-field_36_4" name="wpforms[fields][36][]" value="UiPath" ><label class="wpforms-field-label-inline" for="wpforms-7646-field_36_4">UiPath</label></li><li class="choice-5 depth-1"><input type="checkbox" id="wpforms-7646-field_36_5" name="wpforms[fields][36][]" value="Automation Anywhere" ><label class="wpforms-field-label-inline" for="wpforms-7646-field_36_5">Automation Anywhere</label></li></ul></div><div id="wpforms-7646-field_11-container" class="wpforms-field wpforms-field-pagebreak" data-field-id="11"><div class="wpforms-clear wpforms-pagebreak-left"></div></div></div></div><div class="wpforms-field wpforms-field-hp"><label for="wpforms-7646-field-hp" class="wpforms-field-label">Message</label><input type="text" name="wpforms[hp]" id="wpforms-7646-field-hp" class="wpforms-field-medium"></div><input type="hidden" name="wpforms[recaptcha]" value=""><div class="wpforms-submit-container" style="display:none;"><input type="hidden" name="wpforms[id]" value="7646"><input type="hidden" name="wpforms[author]" value="3"><input type="hidden" name="wpforms[post_id]" value="373"><button type="submit" name="wpforms[submit]" class="wpforms-submit om-trigger-conversion mon-btn" id="wpforms-submit-7646" value="wpforms-submit" aria-live="assertive" data-alt-text="Submitting..." data-submit-text="Submit">Submit</button></div></form></div> <!-- .wpforms-container -->
[wpforms id="1328"]
<div class="wpforms-container wpforms-container-full subscription-form optin-monster-forms" id="wpforms-1328"><form id="wpforms-form-1328" class="wpforms-validate wpforms-form" data-formid="1328" method="post" enctype="multipart/form-data" action="/blog/test-driven-development/"><noscript class="wpforms-error-noscript">Please enable JavaScript in your browser to complete this form.</noscript><div class="wpforms-field-container"><div id="wpforms-1328-field_1-container" class="wpforms-field wpforms-field-email col-12 col-sm-12 col-md-12 form-group" data-field-id="1"><label class="wpforms-field-label wpforms-label-hide" for="wpforms-1328-field_1">Email <span class="wpforms-required-label">*</span></label><input type="email" id="wpforms-1328-field_1" class="wpforms-field-large wpforms-field-required" name="wpforms[fields][1]" placeholder="Email address" required></div><div id="wpforms-1328-field_8-container" class="wpforms-field wpforms-field-hidden" data-field-id="8"><input type="hidden" id="wpforms-1328-field_8" name="wpforms[fields][8]" value="Subscribe"></div></div><div class="wpforms-field wpforms-field-hp"><label for="wpforms-1328-field-hp" class="wpforms-field-label">Message</label><input type="text" name="wpforms[hp]" id="wpforms-1328-field-hp" class="wpforms-field-medium"></div><input type="hidden" name="wpforms[recaptcha]" value=""><div class="wpforms-submit-container" ><input type="hidden" name="wpforms[id]" value="1328"><input type="hidden" name="wpforms[author]" value="3"><input type="hidden" name="wpforms[post_id]" value="373"><button type="submit" name="wpforms[submit]" class="wpforms-submit om-trigger-conversion btn" id="wpforms-submit-1328" value="wpforms-submit" aria-live="assertive" data-alt-text="Sending..." data-submit-text="Subscribe">Subscribe</button></div></form></div> <!-- .wpforms-container -->