<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>BDD &#8211; Best DevOps</title>
	<atom:link href="https://www.bestdevops.com/tag/bdd/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.bestdevops.com</link>
	<description>Lets Learn, Do it &#38; Share! Thats a Best DevOps!!!</description>
	<lastBuildDate>Tue, 13 Oct 2026 02:33:34 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>
	<item>
		<title>Mastering AssertJ-DB: Simplifying Database Assertions in Java Testing</title>
		<link>https://www.bestdevops.com/mastering-assertj-db-simplifying-database-assertions-in-java-testing/</link>
					<comments>https://www.bestdevops.com/mastering-assertj-db-simplifying-database-assertions-in-java-testing/#respond</comments>
		
		<dc:creator><![CDATA[vijay1 vijay1]]></dc:creator>
		<pubDate>Tue, 29 Apr 2025 10:31:31 +0000</pubDate>
				<category><![CDATA[DevOps]]></category>
		<category><![CDATA[AssertJDB]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[DatabaseTesting]]></category>
		<category><![CDATA[DataQuality]]></category>
		<category><![CDATA[SQLValidation]]></category>
		<category><![CDATA[TestAutomation]]></category>
		<guid isPermaLink="false">https://www.bestdevops.com/?p=30996</guid>

					<description><![CDATA[What is AssertJ-DB? AssertJ-DB is an extension of the AssertJ assertion library designed specifically for database testing in Java.It enables [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="964" height="150" src="https://www.bestdevops.com/wp-content/uploads/2025/04/assertj-db_icon.png" alt="" class="wp-image-31000" srcset="https://www.bestdevops.com/wp-content/uploads/2025/04/assertj-db_icon.png 964w, https://www.bestdevops.com/wp-content/uploads/2025/04/assertj-db_icon-300x47.png 300w, https://www.bestdevops.com/wp-content/uploads/2025/04/assertj-db_icon-768x120.png 768w" sizes="(max-width: 964px) 100vw, 964px" /></figure>



<h1 class="wp-block-heading">What is AssertJ-DB?</h1>



<p class="wp-block-paragraph"><strong>AssertJ-DB</strong> is an extension of the <strong>AssertJ</strong> assertion library designed specifically for <strong>database testing</strong> in Java.<br>It enables developers and testers to write <strong>fluent</strong>, <strong>readable</strong>, and <strong>chainable</strong> assertions directly against relational database content like tables, requests (queries), and changes (insert/update/delete operations).</p>



<p class="wp-block-paragraph">Unlike traditional database verification methods that rely heavily on manual SQL queries and complex checks, AssertJ-DB allows you to <strong>test database states declaratively</strong>, <strong>in plain Java</strong>, improving test maintainability, readability, and developer productivity.</p>



<p class="wp-block-paragraph">AssertJ-DB works with <strong>JDBC-compatible databases</strong> such as MySQL, PostgreSQL, Oracle, SQL Server, H2, and more.</p>



<p class="wp-block-paragraph">It is particularly valuable in unit tests, integration tests, and end-to-end testing where validating the database is a crucial aspect.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h1 class="wp-block-heading">Major Use Cases of AssertJ-DB</h1>



<ol class="wp-block-list">
<li><strong>Database State Validation</strong><br>Confirm that after performing operations (e.g., creating an order, updating a profile), the database reflects the expected data.</li>



<li><strong>Change Tracking Tests</strong><br>Validate that a specific number and type of database changes (insert, update, delete) occur after an action.</li>



<li><strong>SQL Query Result Assertions</strong><br>Test specific queries or stored procedures by asserting the structure and data of the returned result set.</li>



<li><strong>Transactional Testing</strong><br>Assert the state of tables during or after transactions without writing raw JDBC code.</li>



<li><strong>Data Migration Verification</strong><br>When migrating data from one schema/version/system to another, assert that the resulting tables match expected conditions.</li>



<li><strong>CI/CD Pipeline Testing</strong><br>Integrate AssertJ-DB tests into automated pipelines to ensure database consistency after deployments.</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="370" src="https://www.bestdevops.com/wp-content/uploads/2025/04/image-29-1024x370.png" alt="" class="wp-image-31001" srcset="https://www.bestdevops.com/wp-content/uploads/2025/04/image-29-1024x370.png 1024w, https://www.bestdevops.com/wp-content/uploads/2025/04/image-29-300x108.png 300w, https://www.bestdevops.com/wp-content/uploads/2025/04/image-29-768x278.png 768w, https://www.bestdevops.com/wp-content/uploads/2025/04/image-29.png 1071w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h1 class="wp-block-heading">How AssertJ-DB Works – Architecture Overview</h1>



<h3 class="wp-block-heading">Core Components:</h3>



<ul class="wp-block-list">
<li><strong>Table</strong>:<br>Represents the full content of a specific database table at a point in time.</li>



<li><strong>Request</strong>:<br>Represents the result of executing a custom SQL query.</li>



<li><strong>Changes</strong>:<br>Captures and asserts differences in database state over time (e.g., between two operations).</li>



<li><strong>Assertions API</strong>:<br>Fluent Java assertions for columns, rows, values, and changes.</li>
</ul>



<h3 class="wp-block-heading">How It Works:</h3>



<ol class="wp-block-list">
<li><strong>Connection Setup</strong><br>AssertJ-DB connects to the database using JDBC.</li>



<li><strong>Snapshot</strong><br>It captures snapshots of table states or query results.</li>



<li><strong>Comparison &amp; Assertions</strong><br>Developers write fluent assertions comparing expected values with actual database contents.</li>



<li><strong>Change Tracking</strong><br>Optionally, developers can capture and compare database state <strong>before</strong> and <strong>after</strong> actions to assert changes.</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h1 class="wp-block-heading">Visual Architecture:</h1>


<pre class="wp-block-code"><span><code class="hljs">+------------------+
| JDBC Connection  |
+--------+---------+
         |
         v
+------------------------+
| Table / Request / Changes |
+------------------------+
         |
         v
+----------------------------+
| AssertJ-DB Fluent Assertions |
+----------------------------+
         |
         v
+---------------------+
| Test Pass / Fail    |
+---------------------+
</code></span></pre>


<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h1 class="wp-block-heading">Basic Workflow of AssertJ-DB</h1>



<ol class="wp-block-list">
<li><strong>Connect to Database</strong><br>Use JDBC URL, user, and password to set up the connection.</li>



<li><strong>Take a Snapshot</strong><br>Capture the current state of a table, a custom SQL query, or database changes.</li>



<li><strong>Perform Actions</strong><br>Trigger the operations you want to test (e.g., insert data, update records).</li>



<li><strong>Capture Changes (Optional)</strong><br>Capture new database state if change tracking is needed.</li>



<li><strong>Write Assertions</strong><br>Use AssertJ-DB fluent API to assert database values, rows, columns, or changes.</li>



<li><strong>Run Tests</strong><br>Execute tests in your JUnit/TestNG testing framework.</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h1 class="wp-block-heading">Step-by-Step Getting Started Guide for AssertJ-DB</h1>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">✅ Pre-requisites</h3>



<ul class="wp-block-list">
<li>Java 8 or higher</li>



<li>JUnit 5 or TestNG installed</li>



<li>Maven or Gradle build system</li>



<li>A running database instance (MySQL, PostgreSQL, H2, etc.)</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">🛠️ Step 1: Add AssertJ-DB to Your Project</h3>



<p class="wp-block-paragraph"><strong>For Maven:</strong></p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">dependency</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>org.assertj<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>assertj-db<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">version</span>&gt;</span>2.0.2<span class="hljs-tag">&lt;/<span class="hljs-name">version</span>&gt;</span> <span class="hljs-comment">&lt;!-- Use latest stable version --&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">scope</span>&gt;</span>test<span class="hljs-tag">&lt;/<span class="hljs-name">scope</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">dependency</span>&gt;</span>
</code></span></pre>


<p class="wp-block-paragraph"><strong>For Gradle:</strong></p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">testImplementation <span class="hljs-string">'org.assertj:assertj-db:2.0.2'</span>
</code></span></pre>


<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">🛠️ Step 2: Setup JDBC Connection</h3>


<pre class="wp-block-code"><span><code class="hljs language-javascript">Connection connection = DriverManager.getConnection(
    <span class="hljs-string">"jdbc:h2:mem:testdb"</span>, <span class="hljs-string">"sa"</span>, <span class="hljs-string">""</span>
);
</code></span></pre>


<p class="wp-block-paragraph">(Replace with your database URL, username, password.)</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">🛠️ Step 3: Create a Table Assertion</h3>



<p class="wp-block-paragraph"><strong>Example: Validate Table Content</strong></p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">import</span> org.assertj.db.type.Table;
<span class="hljs-keyword">import</span> <span class="hljs-keyword">static</span> org.assertj.db.api.Assertions.assertThat;

Table table = <span class="hljs-keyword">new</span> Table(connection, <span class="hljs-string">"users"</span>);

assertThat(table)
    .hasNumberOfRows(<span class="hljs-number">2</span>)
    .row(<span class="hljs-number">0</span>)
    .value(<span class="hljs-string">"username"</span>).isEqualTo(<span class="hljs-string">"admin"</span>)
    .value(<span class="hljs-string">"email"</span>).isEqualTo(<span class="hljs-string">"admin@example.com"</span>);
</code></span></pre>


<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">🛠️ Step 4: Track and Assert Changes</h3>



<p class="wp-block-paragraph"><strong>Example: Validate Changes After an Insert</strong></p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">import</span> org.assertj.db.type.Changes;

Changes changes = <span class="hljs-keyword">new</span> Changes(connection);
changes.setStartPointNow();

<span class="hljs-comment">// Perform action: insert a user</span>
statement.executeUpdate(<span class="hljs-string">"INSERT INTO users(username, email) VALUES('john', 'john@example.com')"</span>);

changes.setEndPointNow();

assertThat(changes)
    .hasNumberOfChanges(<span class="hljs-number">1</span>)
    .change()
    .isCreation()
    .rowAtEndPoint()
    .value(<span class="hljs-string">"username"</span>).isEqualTo(<span class="hljs-string">"john"</span>)
    .value(<span class="hljs-string">"email"</span>).isEqualTo(<span class="hljs-string">"john@example.com"</span>);
</code></span></pre>


<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">🛠️ Step 5: Run Tests</h3>



<p class="wp-block-paragraph">Run the above test class as a JUnit 5 or TestNG test.<br>✅ You now have <strong>strong and readable database assertions</strong> inside your Java tests!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bestdevops.com/mastering-assertj-db-simplifying-database-assertions-in-java-testing/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>4 elements of a highly effective continuous testing strategy</title>
		<link>https://www.bestdevops.com/4-elements-of-a-highly-effective-continuous-testing-strategy/</link>
					<comments>https://www.bestdevops.com/4-elements-of-a-highly-effective-continuous-testing-strategy/#respond</comments>
		
		<dc:creator><![CDATA[anil]]></dc:creator>
		<pubDate>Wed, 04 Nov 2020 05:19:22 +0000</pubDate>
				<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[4 elements]]></category>
		<category><![CDATA[ATDD]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[DevOps]]></category>
		<guid isPermaLink="false">http://www.bestdevops.com/?p=14233</guid>

					<description><![CDATA[Source:-https://techbeacon.com Often, when organizations plan and implement an effective test automation strategy, they believe that they are implementing continuous testing. [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Source:-https://techbeacon.com</p>
<p>Often, when organizations plan and implement an effective test automation strategy, they believe that they are implementing continuous testing. They are wrong.</p>
<p>Test automation is certainly one of the most critical components of continuous testing. But implementing continuous testing begins with a multi-layered test strategy that includes all the types and levels of testing required—including unit, integration, functional, exploratory, and automated. Continuous testing must also have a strategy for incorporating testing throughout the continuous integration pipeline.</p>
<p>Organizations turn to DevOps to increase value and improve the customer experience by maximizing the speed of delivery without sacrificing quality. DevOps delivers by implementing a continuous delivery pipeline, which requires continuous testing.</p>
<p>But just what is continuous testing? The practice goes beyond executing automated tests throughout the software delivery pipeline and providing immediate feedback on the risks associated with a potential release.</p>
<p>Continuous testing requires continuous business and technical risk analysis, as well as process improvement and automation throughout the continuous integration process. Equally critical is developing a culture in which quality is a shared responsibility of every team member. It is based on an approach to managing risk that eliminates testing bottlenecks by improving the effectiveness and increasing the efficiency of your test processes.</p>
<p>Here are four key steps for an effective continuous test strategy, plus what you need to know about each.</p>
<p><strong>1. Streamline the test process</strong><br />
This has three components: focusing on business risk, identifying and mitigating bottlenecks, and optimizing your tests.</p>
<p>The ultimate goal of DevOps and, therefore, the goal of continuous testing, is to mitigate business risk, which is composed of both customer risk and organizational risk.</p>
<p>Customer risk involves understanding which application workflows are most important to the customer and planning your risk-based test coverage accordingly.</p>
<p>Organizational risk involves understanding the complexities of the business climate as well as the product itself. For example, is it critical to be first to market, or is the product health or safety more important? Once the overall business risk is accurately assessed, you should map requirements, application components, and tests to those risks.</p>
<p>It is critical to identify and mitigate bottlenecks; they impede both quality and velocity. Constraints to the test process can be found throughout, from requirements through post-production checkout. Some examples include testers not being included in backlog refinement so they don&#8217;t have the opportunity to help build the acceptance criteria, defects not being addressed on a timely basis, automated test suites running too long, and post-production checkouts being done manually.</p>
<p><strong>Optimize your tests</strong><br />
Test optimization, the foundation for an effective automation strategy for continuous testing, is the practice of selecting the right tests that provide the test coverage you need with the fewest number of test cases.</p>
<p>This practice has many applications, from risk-based selection of tests for a full regression suite to choosing tests for targeted testing and regression of new features. It is a dynamic, ongoing process, especially when applied as part of a continuous testing framework. Test optimization should take place prior to automation and must continue throughout the continuous testing process.</p>
<p>The first step here is optimizing the test scope by understanding all integrations involved in critical user workflows—including the technologies employed in those applications (web, mobile, message/API layer, etc.).</p>
<p>Once you have a clear understanding of the test scope, your next step is to optimize the test cases. This includes not only analyzing test cases for their quality and level of detail, but also selecting tests that provide the greatest level of test coverage. Your test suites should be designed to provide the maximum amount of coverage with the fewest number of test cases to increase both quality and velocity.</p>
<p>Test optimization is a dynamic process. Evaluating effectiveness is a critical part of maintaining an optimized test suite. The suite should be evaluated continually to deprecate tests that are no longer needed, address flaky tests, and add new tests based on new features.</p>
<p><strong>2. Automate testing throughout the CI pipeline</strong><br />
Continuous testing requires test automation throughout the delivery pipeline. Test automation increases the speed of deployment and reduces the risk inherent in continuous delivery.</p>
<p>But automation within the continuous testing framework is about more than just developing and maintaining an automated regression suite. In fact, automated regression suites, especially those that run overnight, create bottlenecks in the continuous deployment process. Continuous testing requires a test automation strategy that enhances, rather than impedes, the continuous delivery process.</p>
<p>It is not enough to implement an optimized regression test suite. The automation test strategy must include automated checkpoints at each step in the build process. This begins with unit tests that verify individual pieces of code and component tests to verify key features. Risk-based regression test suites should be customized based on the features you&#8217;re currently implementing.</p>
<p>Automated testing continues into production, with post-deployment health checks to ensure the applications are up and running. As a final step, production monitoring should find functional and performance issues before the customer finds them.</p>
<p>Within your continuous testing strategy, test automation must be designed to run efficiently while providing reliable, consistent, reproducible results. Your automation strategy must be well developed and include the test maintenance plan and a schedule of which automated tests should run at specific points along the delivery pipeline.</p>
<p><strong>3. Shift left</strong><br />
To implement a successful continuous testing strategy, it is critical that the team embrace the shift-left tenet of quality engineering, which advocates testing as early as possible in the development process. Quality engineering is the practice of building quality in throughout the process; it starts with development and focuses on preventing defects, rather than finding them. Shifting testing left enables quality engineering and continuous testing.</p>
<p>Test-driven development (TDD), behavior-driven development (BDD), and acceptance test-driven development (ATDD) are all techniques used to &#8220;shift left.&#8221;</p>
<p>In TDD, developers and testers work together to design the test first, and then develop the code to make the test pass. BDD is TDD with a design focus on customer behavior. ATDD focuses on customer-centric design where the &#8220;three amigos&#8221;—developers, testers, and product owners—share responsibility for and work together in design sessions.</p>
<p>It’s important to take a shift-left approach to nonfunctional testing as well. Since the root cause of many performance and security defects can be found in design, it&#8217;s critical to find defects early, before the design is finalized. When you don&#8217;t find those defects until late in the process, they become much more complicated and expensive to fix.</p>
<p><strong>4. Take responsibility for quality</strong><br />
This step is the underpinning of the continuous testing strategy. Unless all team members accept their roles in quality assurance, it will be impossible to successfully implement the other elements.</p>
<p>Taking responsibility for quality requires a shift in mindset that must be led from the top. Education is critical, since each member of your team must understand the nature of his or her role in quality engineering.</p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bestdevops.com/4-elements-of-a-highly-effective-continuous-testing-strategy/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>4 Ways to Kickstart Your DevOps Spring Cleaning</title>
		<link>https://www.bestdevops.com/4-ways-to-kickstart-devops-spring-cleaning/</link>
					<comments>https://www.bestdevops.com/4-ways-to-kickstart-devops-spring-cleaning/#respond</comments>
		
		<dc:creator><![CDATA[anil]]></dc:creator>
		<pubDate>Sat, 11 May 2019 06:00:59 +0000</pubDate>
				<category><![CDATA[Continuous Delivery]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[organizations]]></category>
		<category><![CDATA[SDLC]]></category>
		<category><![CDATA[skill]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[spring cleaning]]></category>
		<category><![CDATA[Technologies]]></category>
		<guid isPermaLink="false">http://www.bestdevops.com/?p=5093</guid>

					<description><![CDATA[Slow releases, blurry roles, and skill gaps can quietly erode your DevOps practice. Here are four actionable steps—from clarifying responsibilities to modernising automation—that help engineering teams reset and accelerate delivery.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><em>This article is based on guidance originally published by <a href="https://enterprisersproject.com" rel="noopener">The Enterprisers Project</a>.</em></p>



<p class="wp-block-paragraph">New device releases, shifting market expectations, and a perpetual shortage of skilled engineers make spring one of the most demanding periods for software development teams. Rather than simply pushing harder, it is worth taking a step back to assess your DevOps practice and clear out the friction that slows delivery. Below are four concrete areas where a focused clean-up can yield faster releases and measurably better customer satisfaction.</p>



<h2 class="wp-block-heading">1. Clarify Roles and Responsibilities</h2>



<p class="wp-block-paragraph">DevOps deliberately blurs the traditional boundaries between development, testing, security, and operations—and that flexibility is a feature, not a bug. However, when responsibilities are permanently ambiguous, engineers experience role confusion, accountability gaps open up, and handoffs break down.</p>



<p class="wp-block-paragraph">As security and networking move earlier into the software development lifecycle (SDLC), every team needs a clear picture of where they plug in. A practical starting point is to schedule what some practitioners call <strong>service health reviews</strong>: regular, structured meetings where each team discusses the current state of production services, recent wins, and active pain points—including cultural ones. Monthly cadence tends to work well; it is frequent enough to catch drift before it compounds, but not so frequent that it becomes overhead.</p>



<ul class="wp-block-list">
<li>Document who owns each stage of the SDLC before a new project kicks off.</li>
<li>Distinguish between who is <em>responsible</em> for a task and who is merely <em>consulted</em> (a simple RACI matrix can help).</li>
<li>Revisit role definitions whenever the team structure or toolchain changes significantly.</li>
</ul>



<h2 class="wp-block-heading">2. Sharpen Your Team&#8217;s Skill Sets</h2>



<p class="wp-block-paragraph">The blurring of DevOps roles demands a broader and continually refreshed skill set. Automation expertise, cloud-native tooling, security fundamentals, and observability practices are all increasingly expected of engineers across the pipeline—not just specialists. A periodic skills audit helps identify where your team is well-covered and where gaps could become blockers.</p>



<p class="wp-block-paragraph">Three levers that consistently move the needle on team capability:</p>



<ul class="wp-block-list">
<li><strong>Secure executive buy-in.</strong> Training budgets and protected learning time require leadership commitment. Frame the investment in terms of delivery risk and time-to-market rather than abstract professional development.</li>
<li><strong>Establish a structured mentoring programme.</strong> Pairing engineers of different experience levels—cross-functionally where possible—accelerates knowledge transfer and surfaces operational knowledge that is rarely written down. Mentors should be matched on complementary skills, not just seniority.</li>
<li><strong>Let teams choose frameworks that suit them.</strong> Acceptance Test-Driven Development (ATDD) and Behaviour-Driven Development (BDD) are two approaches that help bridge skill gaps across the SDLC by grounding work in shared, human-readable specifications rather than implementation-specific details.</li>
</ul>



<h2 class="wp-block-heading">3. Identify and Remove Delivery Barriers</h2>



<p class="wp-block-paragraph">Before investing in new tools, audit what you already have. Systematically review your pipeline for bottlenecks—places where work queues, hand-offs stall, or feedback loops are too slow. Useful data sources include:</p>



<ul class="wp-block-list">
<li><strong>Performance metrics:</strong> deployment frequency, lead time for changes, mean time to recovery (MTTR), and change failure rate.</li>
<li><strong>Customer feedback:</strong> bug reports, support ticket volume, and satisfaction scores tied to specific releases.</li>
<li><strong>Team self-assessment:</strong> ask engineers directly where they lose the most time on non-value-adding work.</li>
</ul>



<p class="wp-block-paragraph">Once barriers are visible, establish explicit best practices for how teams share work, communicate application health, and hand off changes for review or testing. Specifically, a well-maintained codebase with continuous testing at every stage can:</p>



<ul class="wp-block-list">
<li>Prevent memory leaks and regressions from reaching production.</li>
<li>Stop poor coding patterns before they proliferate across the codebase.</li>
<li>Ensure that every team member has timely, accurate visibility into build and deployment status.</li>
</ul>



<h2 class="wp-block-heading">4. Revisit and Modernise Your Automation Strategy</h2>



<p class="wp-block-paragraph">Automation is no longer optional in a high-velocity DevOps environment, but not all automation is created equal. A common mistake is treating automation as a one-time investment: scripts written years ago may be fragile, inconsistently maintained, or fundamentally unsuited to a pipeline that has since evolved.</p>



<p class="wp-block-paragraph">A useful framework for your audit:</p>



<ul class="wp-block-list">
<li><strong>Keep what works.</strong> Stable, deterministic automation that passes consistently should be left largely untouched. Unnecessary refactoring introduces new risk.</li>
<li><strong>Replace or augment what is flaky.</strong> Tests or scripts that produce inconsistent results erode trust and slow pipelines. Evaluate whether AI-assisted or model-based testing tools can improve coverage and reliability in those areas.</li>
<li><strong>Map automation to your CD goals.</strong> Every piece of automation should have a clear owner, a defined trigger, and a measurable contribution to shortening the path to production.</li>
</ul>



<p class="wp-block-paragraph">Advances in machine learning are making it possible to identify test gaps, predict failure-prone code paths, and prioritise test execution dynamically. These capabilities are genuinely useful when applied to areas where traditional rule-based automation struggles—but they are a complement to solid foundational automation, not a replacement for it.</p>



<h2 class="wp-block-heading">Putting It Together</h2>



<p class="wp-block-paragraph">DevOps improvement does not require a wholesale overhaul. A periodic, structured review of roles, skills, process barriers, and automation maturity can compound into significant gains in delivery speed and quality. Start with one area, measure the impact, and use that momentum to tackle the next. Consistent incremental improvement is, after all, a core DevOps principle.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bestdevops.com/4-ways-to-kickstart-devops-spring-cleaning/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Adopting Continuous Delivery at teamplay, Siemens Healthineers</title>
		<link>https://www.bestdevops.com/adopting-continuous-delivery-at-teamplay-siemens-healthineers/</link>
					<comments>https://www.bestdevops.com/adopting-continuous-delivery-at-teamplay-siemens-healthineers/#respond</comments>
		
		<dc:creator><![CDATA[anil]]></dc:creator>
		<pubDate>Wed, 05 Sep 2018 06:03:41 +0000</pubDate>
				<category><![CDATA[Continuous Delivery]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[Developer]]></category>
		<category><![CDATA[Siemens Healthineers]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[TDD]]></category>
		<guid isPermaLink="false">http://www.bestdevops.com/?p=4336</guid>

					<description><![CDATA[How the teamplay team at Siemens Healthineers transformed their software development process toward Continuous Delivery in a regulated medical environment — covering pipeline design, BDD, TDD, pair programming, and gradual team adoption.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><em>Source: <a href="https://www.infoq.com/articles/continuous-delivery-teamplay" rel="noopener">InfoQ — Adopting Continuous Delivery at teamplay, Siemens Healthineers</a></em></p>



<h2 class="wp-block-heading">Overview</h2>



<p class="wp-block-paragraph">Continuous Delivery (CD) is the practice of keeping software in a releasable state throughout its entire development lifecycle. While the idea sounds simple, achieving it requires rethinking every aspect of a traditional software development process — from requirements engineering through to deployment.</p>



<p class="wp-block-paragraph">This article describes how the teamplay development organisation at Siemens Healthineers began a transformation toward Continuous Delivery. It covers the strategy and tactics used to gradually and safely change a development process operating within a regulated medical domain.</p>



<h2 class="wp-block-heading">About teamplay</h2>



<p class="wp-block-paragraph">teamplay is a cloud-based performance management solution for medical institutions developed by Siemens Healthineers. It connects healthcare professionals, imaging devices and institutions to help radiology and cardiology departments tackle large-scale data challenges and manage increasing cost pressure.</p>



<p class="wp-block-paragraph">Once a healthcare institution is connected to the teamplay network, its imaging scanners continuously send data to the cloud. Two representative applications built on the platform are:</p>



<ul class="wp-block-list">
<li><strong>teamplay Usage</strong> — monitors scores and trends such as patient changeover times and the number of examinations performed across different imaging scanners.</li>
<li><strong>teamplay Dose</strong> — provides insight into radiation dose levels and highlights deviations from internal and national thresholds.</li>
</ul>



<p class="wp-block-paragraph">Third-party developers can also integrate with teamplay via public APIs, and the number of such integrations was growing steadily at the time of writing.</p>



<h2 class="wp-block-heading">The Technology Stack</h2>



<p class="wp-block-paragraph">teamplay services run on Microsoft Azure. The user interface is implemented as a Single Page Application in AngularJS. Frontend integration for third-party applications is handled via iFrames, which gives external developers the freedom to use their own technology choices while still plugging into the platform.</p>



<h2 class="wp-block-heading">The Problem: Improving the Development Process</h2>



<p class="wp-block-paragraph">At the start of the transformation, teamplay releases were shipped on a quarterly cadence. The development team identified several goals for improvement:</p>



<ul class="wp-block-list">
<li>Release features more frequently and respond faster to user demand.</li>
<li>Reduce batch sizes to lower the risk of each change.</li>
<li>Eliminate — or significantly reduce — the stabilisation phase that preceded every release.</li>
<li>Improve release-date predictability by increasing quality throughout the process.</li>
</ul>



<p class="wp-block-paragraph">The team&#8217;s first move was to automate development deployments and add automated sanity tests that checked core application functionality immediately after each deployment. This brought a meaningful improvement in product stability, but frequent releases and a shorter stabilisation phase remained difficult to achieve.</p>



<h2 class="wp-block-heading">Adopting Continuous Delivery</h2>



<p class="wp-block-paragraph">Continuous Delivery is far more than deployment automation and automated testing. The goal is to maintain software in a releasable state throughout its development — a requirement that spans both technical engineering and requirements engineering. To help with this transformation, the teamplay team engaged <strong>Dave Farley</strong> (co-author of the book <em>Continuous Delivery</em>) as an advisor and coach.</p>



<p class="wp-block-paragraph">Safety was a non-negotiable constraint. teamplay software is used within healthcare and is subject to medical device regulation, making high quality and compliance essential rather than aspirational.</p>



<p class="wp-block-paragraph">The fundamental objectives of the transformation were:</p>



<ul class="wp-block-list">
<li><strong>Increase the quality and frequency of feedback</strong> — so that teams and individuals can see the outcomes of their decisions quickly.</li>
<li><strong>Improve collaboration</strong> — across a geographically distributed organisation, enabling decisions to be made close to the work.</li>
<li><strong>Shift toward a disciplined engineering culture</strong> — using training, coaching and hands-on pairing to embed new practices.</li>
</ul>



<p class="wp-block-paragraph">The approach combined formal training in CD philosophy with hands-on coaching, pairing experienced practitioners alongside teams as they learned. Technical work focused on better automated tests, more efficient deployment pipelines, story mapping for requirements, and the use of Domain Specific Languages (DSLs) to create executable specifications.</p>



<h2 class="wp-block-heading">Choosing a Pipeline Strategy</h2>



<p class="wp-block-paragraph">A critical early decision was how to reduce feedback cycle time. At the start of the transformation, the team waited between 24 and 48 hours to learn the outcome of a test run. The target was to reduce that to approximately one hour.</p>



<p class="wp-block-paragraph">Three architectural options were considered:</p>



<ul class="wp-block-list">
<li><strong>Optimise the existing monolithic pipeline</strong> — scale build servers, introduce incremental compilation, and run only tests affected by a given change.</li>
<li><strong>Decompose into microservices</strong> — create a dedicated pipeline per microservice, requiring backwards-compatible contracts between services.</li>
<li><strong>A middle-ground: one pipeline per teamplay application</strong> — making each application independently releasable without requiring a full microservice decomposition.</li>
</ul>



<p class="wp-block-paragraph">The team chose the middle-ground option. It avoided the complexity of optimising a monolithic pipeline and deferred the engineering investment required for a full microservice architecture. The microservice approach was noted as a possible future direction.</p>



<h2 class="wp-block-heading">The Continuous Delivery Model</h2>



<p class="wp-block-paragraph">Through workshops, coaching sessions and training courses, the team established a visual model for Continuous Delivery that maps the complete journey from idea to production deployment.</p>



<figure class="wp-block-image"><img decoding="async" src="https://res.infoq.com/articles/continuous-delivery-teamplay/en/resources/1figure-2-Model-Continuous-Delivery-small-1535708263947.jpg" alt="Diagram of the teamplay Continuous Delivery model showing roles, methodologies and pipeline stages" /></figure>



<p class="wp-block-paragraph">The model identifies which role is responsible for each step and which methodology — TDD, BDD, DDD, or Pair Programming — applies at each stage. Roles include Product Owner (PO), Business Analyst (BA), Designer, Architect, Developer and Operations Engineer.</p>



<p class="wp-block-paragraph">The pipeline itself has four stages: <strong>Accept 1 → Accept 2 → Staging → Production</strong>.</p>



<h2 class="wp-block-heading">Process Walk-Through: From Idea to Commit</h2>



<h3 class="wp-block-heading">1. Hypothesis</h3>



<p class="wp-block-paragraph">Every new feature begins with a stated hypothesis in the form:</p>



<ul class="wp-block-list">
<li><em>We believe that this &lt;capability&gt;</em></li>
<li><em>Will result in this &lt;outcome&gt;</em></li>
<li><em>We will know we have succeeded when we see a &lt;measurable signal&gt;</em></li>
</ul>



<p class="wp-block-paragraph">The hypothesis scopes the work: only as much functionality and production instrumentation as needed to test the hypothesis should be built.</p>



<h3 class="wp-block-heading">2. Low-Fidelity Prototype</h3>



<p class="wp-block-paragraph">The Product Owner and Designer create a low-fidelity prototype — a paper sketch or quick wireframe — to communicate the idea to other roles and gather early customer feedback before significant investment is made.</p>



<h3 class="wp-block-heading">3. Story Mapping</h3>



<p class="wp-block-paragraph">The whole team — POs, Architects, BAs, Designers and Developers — collaborates to create a User Story Map. The map represents user journeys hierarchically, including steps performed outside the product where relevant. From the story map, the team identifies a Minimal Viable Product (MVP) slice and selects a single story for refinement.</p>



<h3 class="wp-block-heading">4. BDD Scenarios</h3>



<p class="wp-block-paragraph">Stories are refined using BDD Scenarios written in Gherkin (<code>Given / When / Then</code>). Each role contributes scenarios from their perspective:</p>



<ul class="wp-block-list">
<li><strong>PO</strong> — functional scenarios from a user perspective.</li>
<li><strong>Architect</strong> — scenarios covering load and security concerns.</li>
<li><strong>Operations Engineers</strong> — scenarios related to monitoring and logging.</li>
<li><strong>Business Analyst</strong> — ensures all &#8220;ilities&#8221; (reliability, scalability, maintainability, etc.) are covered.</li>
</ul>



<p class="wp-block-paragraph">Stories should be kept small. If a story produces more than roughly six scenarios it is likely too large and should be split. Crucially, scenarios must not contain implementation details or UI references — they should read as if written for first-level customer support.</p>



<h2 class="wp-block-heading">BDD, DSL and Acceptance Testing</h2>



<p class="wp-block-paragraph">Once BDD scenarios are agreed, the team builds a <strong>Test DSL (Domain Specific Language)</strong> to express those scenarios in an executable and reusable form. The DSL is inspired by Domain-Driven Design, ensuring that the same language is used from initial discussion through to production code.</p>



<p class="wp-block-paragraph">Dave Farley&#8217;s recommended four-layer acceptance test architecture provides the structural foundation:</p>



<ul class="wp-block-list">
<li><strong>Layer 1 — Test Cases:</strong> Written in the abstract DSL, capturing user intent without implementation details.</li>
<li><strong>Layer 2 — DSL Implementation:</strong> Shared domain-level concepts reusable across many test cases (e.g. <code>AddScannerToHospital</code>, <code>CalculateRadiationDoseByScan</code>).</li>
<li><strong>Layer 3 — Protocol Adapters:</strong> Translate DSL concepts into real interactions with the system under test (REST calls, UI interactions, etc.).</li>
<li><strong>Layer 4 — System Under Test.</strong></li>
</ul>



<p class="wp-block-paragraph">This separation means test cases are loosely coupled to the system. When implementation details change, only the Protocol Adapters need updating — the Test Cases and DSL remain stable. Tests are also functionally isolated, enabling parallel execution and shorter feedback cycles.</p>



<p class="wp-block-paragraph">For a detailed description of this approach, see: <a href="https://www.infoq.com/presentations/acceptance-testing-cd" rel="noopener">Acceptance Testing for Continuous Delivery — Dave Farley (InfoQ)</a>.</p>



<h2 class="wp-block-heading">Using Executable Specifications to Guide TDD</h2>



<p class="wp-block-paragraph">Once an Acceptance Test is written it is expected to fail immediately — there is no product code yet. The team follows a strict <strong>Red → Green → Refactor → Commit</strong> cycle:</p>



<ul class="wp-block-list">
<li><strong>Red:</strong> Write the test. It fails because the production code does not exist.</li>
<li><strong>Green:</strong> Write just enough production code to make the test pass.</li>
<li><strong>Refactor:</strong> Clean up the code while keeping the test green.</li>
<li><strong>Commit:</strong> Push the change into the pipeline.</li>
</ul>



<p class="wp-block-paragraph">Within that cycle, developers also apply TDD at the unit test level — writing a failing unit test first, then the production code slice that satisfies it. This means each piece of functionality is tested at two distinct levels: the acceptance test level (what the system does) and the unit test level (how individual components behave).</p>



<h2 class="wp-block-heading">Pair Programming</h2>



<p class="wp-block-paragraph">All programming tasks — DSL writing, acceptance tests, TDD, production code, pipeline work — are performed in pairs using the <strong>Driver-Navigator</strong> model:</p>



<ul class="wp-block-list">
<li><strong>Driver:</strong> Types code and focuses on syntax and constructs.</li>
<li><strong>Navigator:</strong> Guides direction at a slightly higher conceptual level.</li>
</ul>



<p class="wp-block-paragraph">Roles switch regularly. Pairs are typically disbanded after completing a user story, with developers joining new pairs. This promotes shared code ownership, resilience against team attrition, faster onboarding of new members and faster recovery from test failures because many people understand each area of the codebase.</p>



<p class="wp-block-paragraph">Pair programming can appear costly but it consistently delivers higher quality work and is a highly effective mechanism for embedding new techniques and culture within a team.</p>



<h2 class="wp-block-heading">The Build and Deployment Pipeline</h2>



<p class="wp-block-paragraph">Once a commit enters the pipeline it passes through five stages:</p>



<ul class="wp-block-list">
<li><strong>Build Agent (~5 minutes):</strong> Runs all unit tests and static code analysis. The 5-minute target is deliberate — it is roughly the time a developer pair can take a short break without switching context. Any failure at this stage rejects the commit.</li>
<li><strong>Accept 1 (~1 hour total for Accept 1 + Accept 2):</strong> Deploys the team&#8217;s component in isolation and runs all its Acceptance Tests. Any failure rejects the change.</li>
<li><strong>Accept 2:</strong> Deploys the component alongside its dependencies from other teams and runs Contract Integration Tests against integration points. If contracts between teams become sufficiently solid, this environment may be retired in future.</li>
<li><strong>Staging (Cut):</strong> A customer acceptance environment where selected customers can use the release candidate and provide real feedback. Production-grade monitoring and alerting are applied here.</li>
<li><strong>Production:</strong> Final deployment, also monitored with production-grade alerting.</li>
</ul>



<p class="wp-block-paragraph">A Team Information Radiator displays commit flow and environment state at a glance. Failures appear in red and immediately prompt developer action.</p>



<h2 class="wp-block-heading">Why Short Feedback Cycles Matter</h2>



<p class="wp-block-paragraph">The relationship between feedback speed and software quality is direct. In a CD model, any failing test means the software is not in a releasable state. Long feedback cycles — say six hours — force developers to patch environments directly rather than re-committing a fix, because a full pipeline run would not complete until the following business day. This degrades discipline and erodes quality over time.</p>



<p class="wp-block-paragraph">Targeting a one-hour feedback cycle from Accept 1 and Accept 2 enables developer pairs to make multiple commits per day. If a failure occurs, there are still multiple opportunities within the same working day to fix it, re-commit and see it pass cleanly.</p>



<p class="wp-block-paragraph">Beyond the immediate benefit, driving toward short feedback cycles forces systemic improvements:</p>



<ul class="wp-block-list">
<li>Better team structures</li>
<li>Improved automation</li>
<li>Greater modularity</li>
<li>Better automated testing</li>
<li>Elimination of manual bottlenecks</li>
<li>Improved requirements processes</li>
<li>Better software design</li>
</ul>



<h2 class="wp-block-heading">Adoption Across Teams</h2>



<p class="wp-block-paragraph">Different teams adopted the CD model at different rates, which was expected. Key observations from the rollout:</p>



<ul class="wp-block-list">
<li><strong>User Story Mapping</strong> was adopted by nearly all teams and proved particularly useful for making release prioritisation transparent and collaborative.</li>
<li><strong>TDD and Pairing</strong> were in regular use on some teams and being applied to selected features on others.</li>
<li><strong>BDD</strong> was being applied selectively, with teams growing confidence by experimenting on individual user stories before extending the practice more broadly.</li>
<li><strong>Team Pipelines</strong> were implemented by some teams, with ongoing work to optimise feedback cycle times.</li>
<li><strong>Kanban and #NoEstimates</strong> saw the fastest organic adoption — the majority of teams switched from Scrum and sprint estimates to Kanban and #NoEstimates voluntarily within weeks of being given the choice.</li>
</ul>



<p class="wp-block-paragraph">A key enablement mechanism was a <strong>CD Maturity Model</strong> that allowed teams to self-assess their adoption monthly and identify incremental improvements. Automatically generated dashboards surfaced CD metrics related to deployment stability, helping to guide the transformation in concrete terms.</p>



<p class="wp-block-paragraph">Some teams dedicated a day per fortnight to learning — experimenting with new methodologies at small scale (a single user story) before scaling practices across all stories once confidence was established.</p>



<h2 class="wp-block-heading">Conclusions</h2>



<p class="wp-block-paragraph">The teamplay CD transformation was explicitly framed as a long-term, incremental process — not a big-bang change. Even at an early stage, measurable results emerged. Applying TDD and Pair Programming to a new feature in a historically bug-prone area of the codebase enabled the team to deliver that feature with no production bugs.</p>



<p class="wp-block-paragraph">The broader ambition is to become an <em>experimental organisation</em> — one that continuously runs small business and technical experiments in production to validate assumptions, rather than executing against plans built on assumptions alone. Continuous Delivery is the foundation that makes that kind of organisation technically and culturally possible.</p>



<p class="wp-block-paragraph"><em>Original article published on <a href="https://www.infoq.com/articles/continuous-delivery-teamplay" rel="noopener">InfoQ</a>. This summary was prepared for a DevOps engineering audience.</em></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bestdevops.com/adopting-continuous-delivery-at-teamplay-siemens-healthineers/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Benefits of Behavior-Driven Development (BDD): A Practitioner&#8217;s Perspective</title>
		<link>https://www.bestdevops.com/benefits-of-behavior-driven-development-bdd/</link>
					<comments>https://www.bestdevops.com/benefits-of-behavior-driven-development-bdd/#respond</comments>
		
		<dc:creator><![CDATA[anil]]></dc:creator>
		<pubDate>Mon, 15 May 2017 07:49:10 +0000</pubDate>
				<category><![CDATA[Behavior-Driven Development]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[DevOps Best Practices]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[Behavior Driven Development]]></category>
		<category><![CDATA[BestDevOps]]></category>
		<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">http://www.bestdevops.com/?p=1521</guid>

					<description><![CDATA[Behavior-Driven Development (BDD) bridges the gap between business and engineering teams. Explore eight concrete benefits of adopting BDD, from shared domain language to greater ROI and team confidence.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Behavior-Driven Development (BDD) is more than a testing methodology — it is a collaborative practice that aligns business stakeholders and engineering teams around a shared understanding of what software should do and why. The following benefits are drawn from practitioner experience, originally shared on <em>blogs.agilefaqs.com</em>, and expanded here for a DevOps engineering audience evaluating whether BDD is right for their team.</p>



<h2 class="wp-block-heading">1. Encouraging the Right Conversations at the Right Time</h2>



<p class="wp-block-paragraph">One of BDD&#8217;s most underrated strengths is the culture of questioning it creates. Teams practising BDD naturally ask: <em>Why is this feature important? Why does it need to ship now? How much of it is actually enough?</em> These questions — often awkward to raise in traditional delivery models — become standard practice in BDD-driven ceremonies such as Example Mapping and Three Amigos sessions. The result is a more constructive dialogue between business and engineering before a single line of code is written.</p>



<h2 class="wp-block-heading">2. Better Commitment and Business Buy-In</h2>



<p class="wp-block-paragraph">BDD places heavy emphasis on business value. By requiring concrete, executable examples to justify priority, it pushes stakeholders to articulate <em>why</em> a feature matters rather than simply asserting that it does. Engineers, in turn, better understand the reasoning behind prioritisation decisions and are therefore more likely to commit to them. Teams practising BDD tend to spend less time negotiating over pet features and more time delivering outcomes that matter.</p>



<h2 class="wp-block-heading">3. A Shared, Ubiquitous Domain Language</h2>



<p class="wp-block-paragraph">BDD encourages business and development teams to build a shared vocabulary through collaborative tools such as product discovery workshops, story maps, user stories, acceptance criteria, and Gherkin-style scenarios (<code>Given / When / Then</code>). This ubiquitous domain language is not merely jargon for domain experts — it is understandable by every member of the team, including QA engineers, UX designers, and new joiners. A common language reduces misinterpretation, lowers the barrier to entry for new team members, and decreases the cognitive complexity of the domain model itself.</p>



<h2 class="wp-block-heading">4. Focus on Behaviour, Not Implementation</h2>



<p class="wp-block-paragraph">Teams new to Test-Driven Development (TDD) often fall into the trap of focusing too heavily on testing their implementation rather than specifying the system&#8217;s observable behaviour. BDD corrects this by anchoring conversations around what the system should <em>do for the user</em>, not how it is internally built. This outside-in approach delays implementation decisions until they are necessary, avoiding premature architecture and over-engineering. BDD also helps strike the balance that up-front analysis, design, and test planning struggle to achieve: just enough detail, just in time.</p>



<h2 class="wp-block-heading">5. Supporting Evolutionary Design</h2>



<p class="wp-block-paragraph">Agile — and eXtreme Programming in particular — has established that fully specifying requirements upfront is neither practical nor desirable. BDD embraces this reality. Because BDD scenarios are written collaboratively and incrementally, the system&#8217;s design is free to evolve alongside a deepening understanding of the product. Rather than locking in decisions early, teams can adapt their architecture and behaviour specifications as business needs change, reducing the cost of late-stage rework.</p>



<h2 class="wp-block-heading">6. Breaking Down Knowledge Silos in Distributed Teams</h2>



<p class="wp-block-paragraph">Distributed teams frequently suffer from domain knowledge gaps — particularly sub-teams that are organisationally or geographically distant from the business. These gaps lead to misunderstood requirements, rework, and frustration on both sides. BDD does not eliminate this problem entirely, but it actively encourages closer collaboration and creates artefacts — living documentation in the form of executable specifications — that keep domain knowledge visible and accessible. It also promotes a generalising-specialist mindset, supporting XP practices such as pair programming and collective code ownership.</p>



<h2 class="wp-block-heading">7. Greater Return on Investment (ROI)</h2>



<p class="wp-block-paragraph">Behaviour has a longer shelf life than implementation details. Code changes frequently; the business rule it encodes changes far less often. BDD captures business rules in human-readable scenarios that remain valid and meaningful even as the underlying implementation evolves. When business rules do change, updating a BDD scenario is explicit and traceable — far preferable to hunting through code comments or stale Word documents. This makes BDD a durable investment in documentation and test coverage simultaneously.</p>



<h2 class="wp-block-heading">8. Predictability and Team Confidence</h2>



<p class="wp-block-paragraph">Teams that practise BDD consistently report greater predictability in their delivery and higher confidence in the correctness of their software. Because acceptance criteria are agreed upon before development begins and automated as executable specifications, the definition of &#8220;done&#8221; is unambiguous. Regression suites built from BDD scenarios give engineers a safety net that supports refactoring and continuous delivery pipelines.</p>



<h2 class="wp-block-heading">Clarifying the Team Definitions</h2>



<p class="wp-block-paragraph">In the context of BDD, it is helpful to distinguish between two collaborative groups:</p>



<ul class="wp-block-list">
<li><strong>Business Team</strong> — the people focused on <em>&#8220;Are we building the right product?&#8221;</em> This typically includes Product Owners, Product Managers, Stakeholders, UX Designers, Subject Matter Experts, and Business Analysts.</li>
<li><strong>Development Team</strong> — the people focused on <em>&#8220;Are we building the product right?&#8221;</em> This typically includes Architects, Tech Leads, Developers, Testers, Graphic Designers, and Database Administrators.</li>
</ul>



<p class="wp-block-paragraph">BDD&#8217;s core value proposition is that it forces these two groups to collaborate continuously, rather than handing requirements over a wall and hoping for the best.</p>



<h2 class="wp-block-heading">Is BDD Right for Your Team?</h2>



<p class="wp-block-paragraph">BDD delivers the most value when both business stakeholders and engineering teams are willing to invest time in collaborative specification. It is not a silver bullet — teams working in isolation, or organisations where business stakeholders are unavailable for regular collaboration, will struggle to realise its benefits. However, for teams looking to reduce rework, build shared understanding, and produce living documentation that stays relevant over time, BDD is a compelling practice worth piloting.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bestdevops.com/benefits-of-behavior-driven-development-bdd/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Behavior-Driven Development (BDD): Key Concepts, Benefits, and the Cucumber Framework</title>
		<link>https://www.bestdevops.com/behavior-driven-development/</link>
					<comments>https://www.bestdevops.com/behavior-driven-development/#respond</comments>
		
		<dc:creator><![CDATA[anil]]></dc:creator>
		<pubDate>Thu, 06 Apr 2017 10:01:51 +0000</pubDate>
				<category><![CDATA[Behavior-Driven Development]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[DevOps Updates]]></category>
		<category><![CDATA[IT trends]]></category>
		<category><![CDATA[Test Driven Development]]></category>
		<category><![CDATA[Agile & BDD]]></category>
		<category><![CDATA[ATDD]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[BDD Benefits]]></category>
		<category><![CDATA[Behavior Driven Development]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Testing]]></category>
		<guid isPermaLink="false">http://www.bestdevops.com/?p=1167</guid>

					<description><![CDATA[A practical overview of Behavior-Driven Development (BDD), how it differs from TDD and ATDD, why it pairs well with Agile, and what Cucumber can and cannot do for your team.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><em>This article is based on a webinar led by Tripti Mittal from the Digility/Mastek team, originally published on digility.com. It covers the fundamentals of Behavior-Driven Development (BDD) and practical guidance on using the Cucumber framework.</em></p>



<h2 class="wp-block-heading">What Is Behavior-Driven Development (BDD)?</h2>



<p class="wp-block-paragraph">Behavior-Driven Development (BDD) is an evolution of two earlier practices: Test-Driven Development (TDD) and Acceptance Test-Driven Development (ATDD). It retains the discipline of writing tests early while adding a critical ingredient that TDD often lacks — cross-functional collaboration.</p>



<p class="wp-block-paragraph">In a traditional TDD workflow, testing and development can happen in relative isolation. Developers write failing unit tests, implement the code to pass them, and refactor — often without continuous input from business stakeholders. BDD breaks down that silo by bringing product owners, business analysts, testers, and developers together to define, in plain language, what the software should <em>do</em> before a single line of production code is written.</p>



<p class="wp-block-paragraph">The result is a shared understanding of requirements that reduces ambiguity and misalignment between what the business wants and what engineering delivers.</p>



<h2 class="wp-block-heading">BDD and Agile: Complementary but Not Exclusive</h2>



<p class="wp-block-paragraph">BDD is frequently associated with Agile, but it is not strictly an Agile practice. It is fundamentally a requirements-design and test-design technique that can be applied in any development methodology.</p>



<p class="wp-block-paragraph">That said, BDD and Agile are a natural pairing for two reasons:</p>



<ul class="wp-block-list">
  <li><strong>Fast feedback loops:</strong> Agile sprints demand rapid iteration. BDD scenarios, written before development begins, give developers and testers immediate, concrete targets to work toward within each sprint.</li>
  <li><strong>No dedicated testing phase:</strong> Agile deliberately avoids a long, separate QA phase at the end of a release cycle. BDD enables automation testing to be introduced early in the development process, protecting teams from expensive regressions as the codebase grows.</li>
</ul>



<p class="wp-block-paragraph">For non-Agile teams, BDD still offers value as a structured way to document requirements and design acceptance criteria — it simply won&#8217;t benefit from the tighter sprint cadence that amplifies its feedback advantages.</p>



<h2 class="wp-block-heading">A Core Benefit: Bridging the Gap Between Business and IT</h2>



<p class="wp-block-paragraph">One of BDD&#8217;s most tangible advantages is the way it structures requirements. Rather than relying on abstract, imperative specification documents, BDD uses <strong>Gherkin</strong> — a plain-language, structured syntax — to express requirements as concrete, real-world scenarios.</p>



<p class="wp-block-paragraph">A Gherkin scenario follows a familiar three-part pattern:</p>


<pre class="wp-block-code"><span><code class="hljs language-http"><span class="hljs-attribute">Feature</span>: User login

  Scenario: Successful login with valid credentials
    Given the user is on the login page
    When they enter a valid username and password
    Then they should be redirected to the dashboard</code></span></pre>


<p class="wp-block-paragraph">This format is readable by non-technical stakeholders, executable by automated test tools, and precise enough to drive development. It replaces vague requirements with verifiable, living documentation that stays in sync with the code.</p>



<p class="wp-block-paragraph">The net effect is a much shorter communication loop between business and IT — misunderstandings surface during scenario-writing workshops, not during user acceptance testing weeks later.</p>



<h2 class="wp-block-heading">The Cucumber Framework: What It Does and What It Doesn&#8217;t</h2>



<h3 class="wp-block-heading">What Cucumber Is</h3>



<p class="wp-block-paragraph">Cucumber is one of the most widely used open-source tools for implementing a BDD workflow. It reads Gherkin feature files and maps each step (<code>Given</code>, <code>When</code>, <code>Then</code>) to executable test code written in a supporting language such as Java, Ruby, JavaScript, or Python. Its primary purpose is to act as a <em>concept layer</em> — a bridge between human-readable specifications and automated test execution.</p>



<p class="wp-block-paragraph">A Cucumber feature file is not merely a test script. It is a document that captures:</p>



<ul class="wp-block-list">
  <li>A brief explanation of the feature and its business value</li>
  <li>The business rules that govern the feature&#8217;s behavior</li>
  <li>Concrete scenarios that illustrate each rule with real data</li>
</ul>



<p class="wp-block-paragraph">This makes feature files useful artifacts for the entire team, not just QA engineers.</p>



<h3 class="wp-block-heading">What Cucumber Is Not</h3>



<p class="wp-block-paragraph">A common and costly misconception is that adopting Cucumber — or any BDD tool — will automatically transform an organisation&#8217;s approach to quality. It will not. Cucumber is a framework, not a strategy.</p>



<p class="wp-block-paragraph">Specifically, BDD tooling will not resolve:</p>



<ul class="wp-block-list">
  <li><strong>A shortage of automation expertise:</strong> If your team lacks engineers who know how to build and maintain reliable automated tests, adding Cucumber simply means those problems are now expressed in Gherkin.</li>
  <li><strong>Inadequate test coverage:</strong> Gherkin scenarios are only as good as the thinking that goes into them. Shallow scenario design produces shallow coverage, whether automated or manual.</li>
  <li><strong>Low application testability:</strong> Applications that lack stable APIs for service-level testing, use poorly named UI elements, or are built on legacy technologies (such as Flash-based interfaces) will remain difficult to automate regardless of the BDD tooling applied.</li>
</ul>



<p class="wp-block-paragraph">BDD tooling supports good practices — it does not create them. Teams must invest in automation skills, thoughtful scenario design, and testable application architecture alongside any tooling decision.</p>



<h2 class="wp-block-heading">Summary: Five Key Takeaways</h2>



<ol class="wp-block-list">
  <li><strong>BDD is a collaborative practice,</strong> not just a testing technique. Its value comes from bringing developers, testers, and business stakeholders together to define behavior before code is written.</li>
  <li><strong>BDD works in any methodology</strong> but delivers the greatest feedback advantage in Agile environments where there is no separate testing phase.</li>
  <li><strong>Gherkin scenarios</strong> add structure and objectivity to requirements by anchoring them to real-world data and examples rather than abstract specifications.</li>
  <li><strong>Cucumber provides a concept layer</strong> that maps readable Gherkin scenarios to executable test code — its purpose is better upfront test definition and reduced redundancy, not magic automation.</li>
  <li><strong>BDD tools do not fix fundamental gaps</strong> in automation skills, test coverage strategy, or application testability. Address those first.</li>
</ol>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bestdevops.com/behavior-driven-development/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
