You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@beam.apache.org by gi...@apache.org on 2020/07/15 00:02:17 UTC

[beam] branch asf-site updated: Publishing website 2020/07/15 00:02:02 at commit 3f3bd49

This is an automated email from the ASF dual-hosted git repository.

git-site-role pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/beam.git


The following commit(s) were added to refs/heads/asf-site by this push:
     new 39db1b1  Publishing website 2020/07/15 00:02:02 at commit 3f3bd49
39db1b1 is described below

commit 39db1b10a366e757f18ab04fd7900d0229fa4617
Author: jenkins <us...@infra.apache.org>
AuthorDate: Wed Jul 15 00:02:02 2020 +0000

    Publishing website 2020/07/15 00:02:02 at commit 3f3bd49
---
 .../pipelines/test-your-pipeline/index.html        | 141 +++++++++++++++------
 website/generated-content/sitemap.xml              |   2 +-
 2 files changed, 105 insertions(+), 38 deletions(-)

diff --git a/website/generated-content/documentation/pipelines/test-your-pipeline/index.html b/website/generated-content/documentation/pipelines/test-your-pipeline/index.html
index 68fa566..f67b9d7 100644
--- a/website/generated-content/documentation/pipelines/test-your-pipeline/index.html
+++ b/website/generated-content/documentation/pipelines/test-your-pipeline/index.html
@@ -1,51 +1,93 @@
 <!doctype html><html lang=en class=no-js><head><meta charset=utf-8><meta http-equiv=x-ua-compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><title>Test Your Pipeline</title><meta name=description content="Apache Beam is an open source, unified model and set of language-specific SDKs for defining and executing data processing workflows, and also data ingestion and integration flows, supporting Enterprise Integration Patterns (EIPs) and Domain Spe [...]
 <span class=sr-only>Toggle navigation</span>
 <span class=icon-bar></span><span class=icon-bar></span><span class=icon-bar></span></button>
-<a href=/ class=navbar-brand><img alt=Brand style=height:25px src=/images/beam_logo_navbar.png></a></div><div class="navbar-mask closed"></div><div id=navbar class="navbar-container closed"><ul class="nav navbar-nav"><li><a href=/get-started/beam-overview/>Get Started</a></li><li><a href=/documentation/>Documentation</a></li><li><a href=/documentation/sdks/java/>Languages</a></li><li><a href=/documentation/runners/capability-matrix/>RUNNERS</a></li><li><a href=/roadmap/>Roadmap</a></li>< [...]
+<a href=/ class=navbar-brand><img alt=Brand style=height:25px src=/images/beam_logo_navbar.png></a></div><div class="navbar-mask closed"></div><div id=navbar class="navbar-container closed"><ul class="nav navbar-nav"><li><a href=/get-started/beam-overview/>Get Started</a></li><li><a href=/documentation/>Documentation</a></li><li><a href=/documentation/sdks/java/>Languages</a></li><li><a href=/documentation/runners/capability-matrix/>RUNNERS</a></li><li><a href=/roadmap/>Roadmap</a></li>< [...]
+    <span class=o>...</span></code></pre></div></div><blockquote><p><strong>Note:</strong> Read about testing unbounded pipelines in Beam in <a href=/blog/2016/10/20/test-stream.html>this blog post</a>.</p></blockquote><h3 id=using-the-create-transform>Using the Create Transform</h3><p>You can use the <code>Create</code> transform to create a <code>PCollection</code> out of a standard in-memory collection class, such as Java or Python <code>List</code>. See <a href=/documentation/program [...]
 
 <span class=c1>// Check whether a PCollection contains some elements in any order.
 </span><span class=c1></span><span class=n>PAssert</span><span class=o>.</span><span class=na>that</span><span class=o>(</span><span class=n>output</span><span class=o>)</span>
 <span class=o>.</span><span class=na>containsInAnyOrder</span><span class=o>(</span>
   <span class=s>&#34;elem1&#34;</span><span class=o>,</span>
   <span class=s>&#34;elem3&#34;</span><span class=o>,</span>
-  <span class=s>&#34;elem2&#34;</span><span class=o>);</span></code></pre></div></div><p>Any code that uses <code>PAssert</code> must link in <code>JUnit</code> and <code>Hamcrest</code>. If you&rsquo;re using Maven, you can link in <code>Hamcrest</code> by adding the following dependency to your project&rsquo;s <code>pom.xml</code> file:</p><div class=language-java><div class=highlight><pre class=chroma><code class=language-java data-lang=java><span class=o>&lt;</span><span class=n>depe [...]
+  <span class=s>&#34;elem2&#34;</span><span class=o>);</span></code></pre></div></div><div class=language-py><div class=highlight><pre class=chroma><code class=language-py data-lang=py><span class=kn>from</span> <span class=nn>apache_beam.testing.util</span> <span class=kn>import</span> <span class=n>assert_that</span>
+<span class=kn>from</span> <span class=nn>apache_beam.testing.util</span> <span class=kn>import</span> <span class=n>equal_to</span>
+
+<span class=n>output</span> <span class=o>=</span> <span class=o>...</span>
+
+<span class=c1># Check whether a PCollection contains some elements in any order.</span>
+<span class=n>assert_that</span><span class=p>(</span>
+    <span class=n>output</span><span class=p>,</span>
+    <span class=n>equal_to</span><span class=p>([</span><span class=s2>&#34;elem1&#34;</span><span class=p>,</span> <span class=s2>&#34;elem3&#34;</span><span class=p>,</span> <span class=s2>&#34;elem2&#34;</span><span class=p>]))</span></code></pre></div></div><p class=language-java>Any Java code that uses <code>PAssert</code> must link in <code>JUnit</code> and <code>Hamcrest</code>. If you&rsquo;re using Maven, you can link in <code>Hamcrest</code> by adding the following dependency t [...]
     <span class=o>&lt;</span><span class=n>groupId</span><span class=o>&gt;</span><span class=n>org</span><span class=o>.</span><span class=na>hamcrest</span><span class=o>&lt;/</span><span class=n>groupId</span><span class=o>&gt;</span>
     <span class=o>&lt;</span><span class=n>artifactId</span><span class=o>&gt;</span><span class=n>hamcrest</span><span class=o>-</span><span class=n>all</span><span class=o>&lt;/</span><span class=n>artifactId</span><span class=o>&gt;</span>
     <span class=o>&lt;</span><span class=n>version</span><span class=o>&gt;</span><span class=n>1</span><span class=o>.</span><span class=na>3</span><span class=o>&lt;/</span><span class=n>version</span><span class=o>&gt;</span>
     <span class=o>&lt;</span><span class=n>scope</span><span class=o>&gt;</span><span class=n>test</span><span class=o>&lt;/</span><span class=n>scope</span><span class=o>&gt;</span>
-<span class=o>&lt;/</span><span class=n>dependency</span><span class=o>&gt;</span></code></pre></div></div><p>For more information on how these classes work, see the <a href=https://beam.apache.org/releases/javadoc/2.22.0/index.html?org/apache/beam/sdk/testing/package-summary.html>org.apache.beam.sdk.testing</a> package documentation.</p><h3 id=an-example-test-for-a-composite-transform>An Example Test for a Composite Transform</h3><p>The following code shows a complete test for a composi [...]
-
-<span class=c1>// Our static input data, which will make up the initial PCollection.
-</span><span class=c1></span><span class=kd>static</span> <span class=kd>final</span> <span class=n>String</span><span class=o>[]</span> <span class=n>WORDS_ARRAY</span> <span class=o>=</span> <span class=k>new</span> <span class=n>String</span><span class=o>[]</span> <span class=o>{</span>
-<span class=s>&#34;hi&#34;</span><span class=o>,</span> <span class=s>&#34;there&#34;</span><span class=o>,</span> <span class=s>&#34;hi&#34;</span><span class=o>,</span> <span class=s>&#34;hi&#34;</span><span class=o>,</span> <span class=s>&#34;sue&#34;</span><span class=o>,</span> <span class=s>&#34;bob&#34;</span><span class=o>,</span>
-<span class=s>&#34;hi&#34;</span><span class=o>,</span> <span class=s>&#34;sue&#34;</span><span class=o>,</span> <span class=s>&#34;&#34;</span><span class=o>,</span> <span class=s>&#34;&#34;</span><span class=o>,</span> <span class=s>&#34;ZOW&#34;</span><span class=o>,</span> <span class=s>&#34;bob&#34;</span><span class=o>,</span> <span class=s>&#34;&#34;</span><span class=o>};</span>
-
-<span class=kd>static</span> <span class=kd>final</span> <span class=n>List</span><span class=o>&lt;</span><span class=n>String</span><span class=o>&gt;</span> <span class=n>WORDS</span> <span class=o>=</span> <span class=n>Arrays</span><span class=o>.</span><span class=na>asList</span><span class=o>(</span><span class=n>WORDS_ARRAY</span><span class=o>);</span>
-
-<span class=kd>public</span> <span class=kt>void</span> <span class=nf>testCount</span><span class=o>()</span> <span class=o>{</span>
-  <span class=c1>// Create a test pipeline.
-</span><span class=c1></span>  <span class=n>Pipeline</span> <span class=n>p</span> <span class=o>=</span> <span class=n>TestPipeline</span><span class=o>.</span><span class=na>create</span><span class=o>();</span>
-
-  <span class=c1>// Create an input PCollection.
-</span><span class=c1></span>  <span class=n>PCollection</span><span class=o>&lt;</span><span class=n>String</span><span class=o>&gt;</span> <span class=n>input</span> <span class=o>=</span> <span class=n>p</span><span class=o>.</span><span class=na>apply</span><span class=o>(</span><span class=n>Create</span><span class=o>.</span><span class=na>of</span><span class=o>(</span><span class=n>WORDS</span><span class=o>)).</span><span class=na>setCoder</span><span class=o>(</span><span class [...]
-
-  <span class=c1>// Apply the Count transform under test.
-</span><span class=c1></span>  <span class=n>PCollection</span><span class=o>&lt;</span><span class=n>KV</span><span class=o>&lt;</span><span class=n>String</span><span class=o>,</span> <span class=n>Long</span><span class=o>&gt;&gt;</span> <span class=n>output</span> <span class=o>=</span>
-    <span class=n>input</span><span class=o>.</span><span class=na>apply</span><span class=o>(</span><span class=n>Count</span><span class=o>.&lt;</span><span class=n>String</span><span class=o>&gt;</span><span class=n>perElement</span><span class=o>());</span>
-
-  <span class=c1>// Assert on the results.
-</span><span class=c1></span>  <span class=n>PAssert</span><span class=o>.</span><span class=na>that</span><span class=o>(</span><span class=n>output</span><span class=o>)</span>
-    <span class=o>.</span><span class=na>containsInAnyOrder</span><span class=o>(</span>
-        <span class=n>KV</span><span class=o>.</span><span class=na>of</span><span class=o>(</span><span class=s>&#34;hi&#34;</span><span class=o>,</span> <span class=n>4L</span><span class=o>),</span>
-        <span class=n>KV</span><span class=o>.</span><span class=na>of</span><span class=o>(</span><span class=s>&#34;there&#34;</span><span class=o>,</span> <span class=n>1L</span><span class=o>),</span>
-        <span class=n>KV</span><span class=o>.</span><span class=na>of</span><span class=o>(</span><span class=s>&#34;sue&#34;</span><span class=o>,</span> <span class=n>2L</span><span class=o>),</span>
-        <span class=n>KV</span><span class=o>.</span><span class=na>of</span><span class=o>(</span><span class=s>&#34;bob&#34;</span><span class=o>,</span> <span class=n>2L</span><span class=o>),</span>
-        <span class=n>KV</span><span class=o>.</span><span class=na>of</span><span class=o>(</span><span class=s>&#34;&#34;</span><span class=o>,</span> <span class=n>3L</span><span class=o>),</span>
-        <span class=n>KV</span><span class=o>.</span><span class=na>of</span><span class=o>(</span><span class=s>&#34;ZOW&#34;</span><span class=o>,</span> <span class=n>1L</span><span class=o>));</span>
-
-  <span class=c1>// Run the pipeline.
-</span><span class=c1></span>  <span class=n>p</span><span class=o>.</span><span class=na>run</span><span class=o>();</span>
-<span class=o>}</span></code></pre></div></div><h2 id=testing-a-pipeline-end-to-end>Testing a Pipeline End-to-End</h2><p>You can use the test classes in the Beam SDKs (such as <code>TestPipeline</code> and <code>PAssert</code> in the Beam SDK for Java) to test an entire pipeline end-to-end. Typically, to test an entire pipeline, you do the following:</p><ul><li>For every source of input data to your pipeline, create some known static test input data.</li><li>Create some static test outpu [...]
+<span class=o>&lt;/</span><span class=n>dependency</span><span class=o>&gt;</span></code></pre></div></div><p>For more information on how these classes work, see the <a href=https://beam.apache.org/releases/javadoc/2.22.0/index.html?org/apache/beam/sdk/testing/package-summary.html>org.apache.beam.sdk.testing</a> package documentation.</p><h3 id=an-example-test-for-a-composite-transform>An Example Test for a Composite Transform</h3><p>The following code shows a complete test for a composi [...]
+
+  <span class=c1>// Our static input data, which will make up the initial PCollection.
+</span><span class=c1></span>  <span class=kd>static</span> <span class=kd>final</span> <span class=n>String</span><span class=o>[]</span> <span class=n>WORDS_ARRAY</span> <span class=o>=</span> <span class=k>new</span> <span class=n>String</span><span class=o>[]</span> <span class=o>{</span>
+  <span class=s>&#34;hi&#34;</span><span class=o>,</span> <span class=s>&#34;there&#34;</span><span class=o>,</span> <span class=s>&#34;hi&#34;</span><span class=o>,</span> <span class=s>&#34;hi&#34;</span><span class=o>,</span> <span class=s>&#34;sue&#34;</span><span class=o>,</span> <span class=s>&#34;bob&#34;</span><span class=o>,</span>
+  <span class=s>&#34;hi&#34;</span><span class=o>,</span> <span class=s>&#34;sue&#34;</span><span class=o>,</span> <span class=s>&#34;&#34;</span><span class=o>,</span> <span class=s>&#34;&#34;</span><span class=o>,</span> <span class=s>&#34;ZOW&#34;</span><span class=o>,</span> <span class=s>&#34;bob&#34;</span><span class=o>,</span> <span class=s>&#34;&#34;</span><span class=o>};</span>
+
+  <span class=kd>static</span> <span class=kd>final</span> <span class=n>List</span><span class=o>&lt;</span><span class=n>String</span><span class=o>&gt;</span> <span class=n>WORDS</span> <span class=o>=</span> <span class=n>Arrays</span><span class=o>.</span><span class=na>asList</span><span class=o>(</span><span class=n>WORDS_ARRAY</span><span class=o>);</span>
+
+  <span class=kd>public</span> <span class=kt>void</span> <span class=nf>testCount</span><span class=o>()</span> <span class=o>{</span>
+    <span class=c1>// Create a test pipeline.
+</span><span class=c1></span>    <span class=n>Pipeline</span> <span class=n>p</span> <span class=o>=</span> <span class=n>TestPipeline</span><span class=o>.</span><span class=na>create</span><span class=o>();</span>
+
+    <span class=c1>// Create an input PCollection.
+</span><span class=c1></span>    <span class=n>PCollection</span><span class=o>&lt;</span><span class=n>String</span><span class=o>&gt;</span> <span class=n>input</span> <span class=o>=</span> <span class=n>p</span><span class=o>.</span><span class=na>apply</span><span class=o>(</span><span class=n>Create</span><span class=o>.</span><span class=na>of</span><span class=o>(</span><span class=n>WORDS</span><span class=o>));</span>
+
+    <span class=c1>// Apply the Count transform under test.
+</span><span class=c1></span>    <span class=n>PCollection</span><span class=o>&lt;</span><span class=n>KV</span><span class=o>&lt;</span><span class=n>String</span><span class=o>,</span> <span class=n>Long</span><span class=o>&gt;&gt;</span> <span class=n>output</span> <span class=o>=</span>
+      <span class=n>input</span><span class=o>.</span><span class=na>apply</span><span class=o>(</span><span class=n>Count</span><span class=o>.&lt;</span><span class=n>String</span><span class=o>&gt;</span><span class=n>perElement</span><span class=o>());</span>
+
+    <span class=c1>// Assert on the results.
+</span><span class=c1></span>    <span class=n>PAssert</span><span class=o>.</span><span class=na>that</span><span class=o>(</span><span class=n>output</span><span class=o>)</span>
+      <span class=o>.</span><span class=na>containsInAnyOrder</span><span class=o>(</span>
+          <span class=n>KV</span><span class=o>.</span><span class=na>of</span><span class=o>(</span><span class=s>&#34;hi&#34;</span><span class=o>,</span> <span class=n>4L</span><span class=o>),</span>
+          <span class=n>KV</span><span class=o>.</span><span class=na>of</span><span class=o>(</span><span class=s>&#34;there&#34;</span><span class=o>,</span> <span class=n>1L</span><span class=o>),</span>
+          <span class=n>KV</span><span class=o>.</span><span class=na>of</span><span class=o>(</span><span class=s>&#34;sue&#34;</span><span class=o>,</span> <span class=n>2L</span><span class=o>),</span>
+          <span class=n>KV</span><span class=o>.</span><span class=na>of</span><span class=o>(</span><span class=s>&#34;bob&#34;</span><span class=o>,</span> <span class=n>2L</span><span class=o>),</span>
+          <span class=n>KV</span><span class=o>.</span><span class=na>of</span><span class=o>(</span><span class=s>&#34;&#34;</span><span class=o>,</span> <span class=n>3L</span><span class=o>),</span>
+          <span class=n>KV</span><span class=o>.</span><span class=na>of</span><span class=o>(</span><span class=s>&#34;ZOW&#34;</span><span class=o>,</span> <span class=n>1L</span><span class=o>));</span>
+
+    <span class=c1>// Run the pipeline.
+</span><span class=c1></span>    <span class=n>p</span><span class=o>.</span><span class=na>run</span><span class=o>();</span>
+  <span class=o>}</span>
+<span class=o>}</span></code></pre></div></div><div class=language-py><div class=highlight><pre class=chroma><code class=language-py data-lang=py><span class=kn>from</span> <span class=nn>apache_beam.testing.util</span> <span class=kn>import</span> <span class=n>assert_that</span>
+<span class=kn>from</span> <span class=nn>apache_beam.testing.util</span> <span class=kn>import</span> <span class=n>equal_to</span>
+
+<span class=k>class</span> <span class=nc>CountTest</span><span class=p>(</span><span class=n>unittest</span><span class=o>.</span><span class=n>TestCase</span><span class=p>):</span>
+
+  <span class=c1># Our static input data, which will make up the initial PCollection.</span>
+  <span class=n>WORDS</span> <span class=o>=</span> <span class=p>[</span>
+      <span class=s2>&#34;hi&#34;</span><span class=p>,</span> <span class=s2>&#34;there&#34;</span><span class=p>,</span> <span class=s2>&#34;hi&#34;</span><span class=p>,</span> <span class=s2>&#34;hi&#34;</span><span class=p>,</span> <span class=s2>&#34;sue&#34;</span><span class=p>,</span> <span class=s2>&#34;bob&#34;</span><span class=p>,</span>
+      <span class=s2>&#34;hi&#34;</span><span class=p>,</span> <span class=s2>&#34;sue&#34;</span><span class=p>,</span> <span class=s2>&#34;&#34;</span><span class=p>,</span> <span class=s2>&#34;&#34;</span><span class=p>,</span> <span class=s2>&#34;ZOW&#34;</span><span class=p>,</span> <span class=s2>&#34;bob&#34;</span><span class=p>,</span> <span class=s2>&#34;&#34;</span>
+  <span class=p>]</span>
+
+  <span class=k>def</span> <span class=nf>test_count</span><span class=p>(</span><span class=bp>self</span><span class=p>):</span>
+    <span class=c1># Create a test pipeline.</span>
+    <span class=k>with</span> <span class=n>beam</span><span class=o>.</span><span class=n>TestPipeline</span> <span class=k>as</span> <span class=n>p</span><span class=p>:</span>
+
+      <span class=c1># Create an input PCollection.</span>
+      <span class=nb>input</span> <span class=o>=</span> <span class=n>p</span> <span class=o>|</span> <span class=n>beam</span><span class=o>.</span><span class=n>Create</span><span class=p>(</span><span class=n>WORDS</span><span class=p>);</span>
+
+      <span class=c1># Apply the Count transform under test.</span>
+      <span class=n>output</span> <span class=o>=</span> <span class=nb>input</span> <span class=o>|</span> <span class=n>beam</span><span class=o>.</span><span class=n>combiners</span><span class=o>.</span><span class=n>Count</span><span class=o>.</span><span class=n>PerElement</span><span class=p>();</span>
+
+      <span class=c1># Assert on the results.</span>
+      <span class=n>assert_that</span><span class=p>(</span>
+        <span class=n>output</span><span class=p>,</span>
+        <span class=n>equal_to</span><span class=p>([</span>
+            <span class=p>(</span><span class=s2>&#34;hi&#34;</span><span class=p>,</span> <span class=mi>4</span><span class=p>),</span>
+            <span class=p>(</span><span class=s2>&#34;there&#34;</span><span class=p>,</span> <span class=mi>1</span><span class=p>),</span>
+            <span class=p>(</span><span class=s2>&#34;sue&#34;</span><span class=p>,</span> <span class=mi>2</span><span class=p>),</span>
+            <span class=p>(</span><span class=s2>&#34;bob&#34;</span><span class=p>,</span> <span class=mi>2</span><span class=p>),</span>
+            <span class=p>(</span><span class=s2>&#34;&#34;</span><span class=p>,</span> <span class=mi>3</span><span class=p>),</span>
+            <span class=p>(</span><span class=s2>&#34;ZOW&#34;</span><span class=p>,</span> <span class=mi>1</span><span class=p>)])</span>
+
+      <span class=c1># The pipeline will run and verify the results.</span></code></pre></div></div><h2 id=testing-a-pipeline-end-to-end>Testing a Pipeline End-to-End</h2><p>You can use the test classes in the Beam SDKs (such as <code>TestPipeline</code> and <code>PAssert</code> in the Beam SDK for Java) to test an entire pipeline end-to-end. Typically, to test an entire pipeline, you do the following:</p><ul><li>For every source of input data to your pipeline, create some known static t [...]
 
     <span class=c1>// Our static input data, which will comprise the initial PCollection.
 </span><span class=c1></span>    <span class=kd>static</span> <span class=kd>final</span> <span class=n>String</span><span class=o>[]</span> <span class=n>WORDS_ARRAY</span> <span class=o>=</span> <span class=k>new</span> <span class=n>String</span><span class=o>[]</span> <span class=o>{</span>
@@ -64,7 +106,7 @@
       <span class=n>Pipeline</span> <span class=n>p</span> <span class=o>=</span> <span class=n>TestPipeline</span><span class=o>.</span><span class=na>create</span><span class=o>();</span>
 
       <span class=c1>// Create a PCollection from the WORDS static input data.
-</span><span class=c1></span>      <span class=n>PCollection</span><span class=o>&lt;</span><span class=n>String</span><span class=o>&gt;</span> <span class=n>input</span> <span class=o>=</span> <span class=n>p</span><span class=o>.</span><span class=na>apply</span><span class=o>(</span><span class=n>Create</span><span class=o>.</span><span class=na>of</span><span class=o>(</span><span class=n>WORDS</span><span class=o>)).</span><span class=na>setCoder</span><span class=o>(</span><span c [...]
+</span><span class=c1></span>      <span class=n>PCollection</span><span class=o>&lt;</span><span class=n>String</span><span class=o>&gt;</span> <span class=n>input</span> <span class=o>=</span> <span class=n>p</span><span class=o>.</span><span class=na>apply</span><span class=o>(</span><span class=n>Create</span><span class=o>.</span><span class=na>of</span><span class=o>(</span><span class=n>WORDS</span><span class=o>));</span>
 
       <span class=c1>// Run ALL the pipeline&#39;s transforms (in this case, the CountWords composite transform).
 </span><span class=c1></span>      <span class=n>PCollection</span><span class=o>&lt;</span><span class=n>String</span><span class=o>&gt;</span> <span class=n>output</span> <span class=o>=</span> <span class=n>input</span><span class=o>.</span><span class=na>apply</span><span class=o>(</span><span class=k>new</span> <span class=n>CountWords</span><span class=o>());</span>
@@ -75,7 +117,32 @@
       <span class=c1>// Run the pipeline.
 </span><span class=c1></span>      <span class=n>p</span><span class=o>.</span><span class=na>run</span><span class=o>();</span>
     <span class=o>}</span>
-<span class=o>}</span></code></pre></div></div></div></div><footer class=footer><div class=footer__contained><div class=footer__cols><div class=footer__cols__col><div class=footer__cols__col__logo><img src=/images/beam_logo_circle.svg class=footer__logo alt="Beam logo"></div><div class=footer__cols__col__logo><img src=/images/apache_logo_circle.svg class=footer__logo alt="Apache logo"></div></div><div class="footer__cols__col footer__cols__col--md"><div class=footer__cols__col__title>Sta [...]
+<span class=o>}</span></code></pre></div></div><div class=language-py><div class=highlight><pre class=chroma><code class=language-py data-lang=py><span class=k>class</span> <span class=nc>WordCountTest</span><span class=p>(</span><span class=n>unittest</span><span class=o>.</span><span class=n>TestCase</span><span class=p>):</span>
+
+  <span class=c1># Our input data, which will make up the initial PCollection.</span>
+  <span class=n>WORDS</span> <span class=o>=</span> <span class=p>[</span>
+      <span class=s2>&#34;hi&#34;</span><span class=p>,</span> <span class=s2>&#34;there&#34;</span><span class=p>,</span> <span class=s2>&#34;hi&#34;</span><span class=p>,</span> <span class=s2>&#34;hi&#34;</span><span class=p>,</span> <span class=s2>&#34;sue&#34;</span><span class=p>,</span> <span class=s2>&#34;bob&#34;</span><span class=p>,</span>
+      <span class=s2>&#34;hi&#34;</span><span class=p>,</span> <span class=s2>&#34;sue&#34;</span><span class=p>,</span> <span class=s2>&#34;&#34;</span><span class=p>,</span> <span class=s2>&#34;&#34;</span><span class=p>,</span> <span class=s2>&#34;ZOW&#34;</span><span class=p>,</span> <span class=s2>&#34;bob&#34;</span><span class=p>,</span> <span class=s2>&#34;&#34;</span>
+  <span class=p>]</span>
+
+  <span class=c1># Our output data, which is the expected data that the final PCollection must match.</span>
+  <span class=n>EXPECTED_COUNTS</span> <span class=o>=</span> <span class=p>[</span><span class=s2>&#34;hi: 5&#34;</span><span class=p>,</span> <span class=s2>&#34;there: 1&#34;</span><span class=p>,</span> <span class=s2>&#34;sue: 2&#34;</span><span class=p>,</span> <span class=s2>&#34;bob: 2&#34;</span><span class=p>]</span>
+
+  <span class=c1># Example test that tests the pipeline&#39;s transforms.</span>
+
+  <span class=k>def</span> <span class=nf>test_count_words</span><span class=p>(</span><span class=bp>self</span><span class=p>):</span>
+    <span class=k>with</span> <span class=n>TestPipeline</span><span class=p>()</span> <span class=k>as</span> <span class=n>p</span><span class=p>:</span>
+
+      <span class=c1># Create a PCollection from the WORDS static input data.</span>
+      <span class=nb>input</span> <span class=o>=</span> <span class=n>p</span> <span class=o>|</span> <span class=n>beam</span><span class=o>.</span><span class=n>Create</span><span class=p>(</span><span class=n>WORDS</span><span class=p>)</span>
+
+      <span class=c1># Run ALL the pipeline&#39;s transforms (in this case, the CountWords composite transform).</span>
+      <span class=n>output</span> <span class=o>=</span> <span class=nb>input</span> <span class=o>|</span> <span class=n>CountWords</span><span class=p>()</span>
+
+      <span class=c1># Assert that the output PCollection matches the EXPECTED_COUNTS data.</span>
+      <span class=n>assert_that</span><span class=p>(</span><span class=n>output</span><span class=p>,</span> <span class=n>equal_to</span><span class=p>(</span><span class=n>EXPECTED_COUNTS</span><span class=p>),</span> <span class=n>label</span><span class=o>=</span><span class=s1>&#39;CheckOutput&#39;</span><span class=p>)</span>
+
+    <span class=c1># The pipeline will run and verify the results.</span></code></pre></div></div></div></div><footer class=footer><div class=footer__contained><div class=footer__cols><div class=footer__cols__col><div class=footer__cols__col__logo><img src=/images/beam_logo_circle.svg class=footer__logo alt="Beam logo"></div><div class=footer__cols__col__logo><img src=/images/apache_logo_circle.svg class=footer__logo alt="Apache logo"></div></div><div class="footer__cols__col footer__col [...]
 <a href=http://www.apache.org>The Apache Software Foundation</a>
 | <a href=/privacy_policy>Privacy Policy</a>
 | <a href=/feed.xml>RSS Feed</a><br><br>Apache Beam, Apache, Beam, the Beam logo, and the Apache feather logo are either registered trademarks or trademarks of The Apache Software Foundation. All other products or name brands are trademarks of their respective holders, including The Apache Software Foundation.</div></footer></body></html>
\ No newline at end of file
diff --git a/website/generated-content/sitemap.xml b/website/generated-content/sitemap.xml
index 47f25e5..b7e5795 100644
--- a/website/generated-content/sitemap.xml
+++ b/website/generated-content/sitemap.xml
@@ -1 +1 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml"><url><loc>/blog/beam-2.22.0/</loc><lastmod>2020-06-08T14:13:37-07:00</lastmod></url><url><loc>/categories/blog/</loc><lastmod>2020-06-08T14:13:37-07:00</lastmod></url><url><loc>/blog/</loc><lastmod>2020-06-08T14:13:37-07:00</lastmod></url><url><loc>/categories/</loc><lastmod>2020-06-08T14:13:37-07:00</lastmod></url><url><loc>/blog/b [...]
\ No newline at end of file
+<?xml version="1.0" encoding="utf-8" standalone="yes"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml"><url><loc>/blog/beam-2.22.0/</loc><lastmod>2020-06-08T14:13:37-07:00</lastmod></url><url><loc>/categories/blog/</loc><lastmod>2020-06-08T14:13:37-07:00</lastmod></url><url><loc>/blog/</loc><lastmod>2020-06-08T14:13:37-07:00</lastmod></url><url><loc>/categories/</loc><lastmod>2020-06-08T14:13:37-07:00</lastmod></url><url><loc>/blog/b [...]
\ No newline at end of file