testwithgo.com Open in urlscan Pro
3.75.10.80  Public Scan

Submitted URL: http://testwithgo.com/
Effective URL: https://testwithgo.com/
Submission: On November 03 via api from US — Scanned from DE

Form analysis 1 forms found in the DOM

POST https://app.kit.com/forms/1469048/subscriptions

<form action="https://app.kit.com/forms/1469048/subscriptions" class="seva-form formkit-form" method="post" data-sv-form="1469048" data-uid="96680ccf0e" data-format="inline" data-version="5" min-width="400">
  <div data-style="clean">
    <ul class="formkit-alert formkit-alert-error" data-element="errors" data-group="alert"></ul>
    <div data-element="fields" data-stacked="false" class="seva-fields formkit-fields">
      <div class="formkit-field"><input type="text" class="formkit-input" name="email_address" style="color:#000;border-color:#e3e3e3;border-radius:4px;font-weight:400" aria-label="Your email address" placeholder="Your email address" required="">
      </div><button data-element="submit" class="formkit-submit formkit-submit" style="color:#1c3d5a;background-color:#fff213;border-radius:4px;font-weight:700">
        <div class="formkit-spinner">
          <div></div>
          <div></div>
          <div></div>
        </div><span class="">&nbsp;REQUEST A SAMPLE&nbsp;</span>
      </button>
    </div>
  </div>
  <style>
    .formkit-form[data-uid="96680ccf0e"] * {
      box-sizing: border-box;
    }

    .formkit-form[data-uid="96680ccf0e"] {
      -webkit-font-smoothing: antialiased;
      -moz-osx-font-smoothing: grayscale;
    }

    .formkit-form[data-uid="96680ccf0e"] legend {
      border: none;
      font-size: inherit;
      margin-bottom: 10px;
      padding: 0;
      position: relative;
      display: table;
    }

    .formkit-form[data-uid="96680ccf0e"] fieldset {
      border: 0;
      padding: 0.01em 0 0 0;
      margin: 0;
      min-width: 0;
    }

    .formkit-form[data-uid="96680ccf0e"] body:not(:-moz-handler-blocked) fieldset {
      display: table-cell;
    }

    .formkit-form[data-uid="96680ccf0e"] h1,
    .formkit-form[data-uid="96680ccf0e"] h2,
    .formkit-form[data-uid="96680ccf0e"] h3,
    .formkit-form[data-uid="96680ccf0e"] h4,
    .formkit-form[data-uid="96680ccf0e"] h5,
    .formkit-form[data-uid="96680ccf0e"] h6 {
      color: inherit;
      font-size: inherit;
      font-weight: inherit;
    }

    .formkit-form[data-uid="96680ccf0e"] h2 {
      font-size: 1.5em;
      margin: 1em 0;
    }

    .formkit-form[data-uid="96680ccf0e"] h3 {
      font-size: 1.17em;
      margin: 1em 0;
    }

    .formkit-form[data-uid="96680ccf0e"] p {
      color: inherit;
      font-size: inherit;
      font-weight: inherit;
    }

    .formkit-form[data-uid="96680ccf0e"] ol:not([template-default]),
    .formkit-form[data-uid="96680ccf0e"] ul:not([template-default]),
    .formkit-form[data-uid="96680ccf0e"] blockquote:not([template-default]) {
      text-align: left;
    }

    .formkit-form[data-uid="96680ccf0e"] p:not([template-default]),
    .formkit-form[data-uid="96680ccf0e"] hr:not([template-default]),
    .formkit-form[data-uid="96680ccf0e"] blockquote:not([template-default]),
    .formkit-form[data-uid="96680ccf0e"] ol:not([template-default]),
    .formkit-form[data-uid="96680ccf0e"] ul:not([template-default]) {
      color: inherit;
      font-style: initial;
    }

    .formkit-form[data-uid="96680ccf0e"] .ordered-list,
    .formkit-form[data-uid="96680ccf0e"] .unordered-list {
      list-style-position: outside !important;
      padding-left: 1em;
    }

    .formkit-form[data-uid="96680ccf0e"] .list-item {
      padding-left: 0;
    }

    .formkit-form[data-uid="96680ccf0e"][data-format="modal"] {
      display: none;
    }

    .formkit-form[data-uid="96680ccf0e"][data-format="slide in"] {
      display: none;
    }

    .formkit-form[data-uid="96680ccf0e"][data-format="sticky bar"] {
      display: none;
    }

    .formkit-sticky-bar .formkit-form[data-uid="96680ccf0e"][data-format="sticky bar"] {
      display: block;
    }

    .formkit-form[data-uid="96680ccf0e"] .formkit-input,
    .formkit-form[data-uid="96680ccf0e"] .formkit-select,
    .formkit-form[data-uid="96680ccf0e"] .formkit-checkboxes {
      width: 100%;
    }

    .formkit-form[data-uid="96680ccf0e"] .formkit-button,
    .formkit-form[data-uid="96680ccf0e"] .formkit-submit {
      border: 0;
      border-radius: 5px;
      color: #ffffff;
      cursor: pointer;
      display: inline-block;
      text-align: center;
      font-size: 15px;
      font-weight: 500;
      cursor: pointer;
      margin-bottom: 15px;
      overflow: hidden;
      padding: 0;
      position: relative;
      vertical-align: middle;
    }

    .formkit-form[data-uid="96680ccf0e"] .formkit-button:hover,
    .formkit-form[data-uid="96680ccf0e"] .formkit-submit:hover,
    .formkit-form[data-uid="96680ccf0e"] .formkit-button:focus,
    .formkit-form[data-uid="96680ccf0e"] .formkit-submit:focus {
      outline: none;
    }

    .formkit-form[data-uid="96680ccf0e"] .formkit-button:hover>span,
    .formkit-form[data-uid="96680ccf0e"] .formkit-submit:hover>span,
    .formkit-form[data-uid="96680ccf0e"] .formkit-button:focus>span,
    .formkit-form[data-uid="96680ccf0e"] .formkit-submit:focus>span {
      background-color: rgba(0, 0, 0, 0.1);
    }

    .formkit-form[data-uid="96680ccf0e"] .formkit-button>span,
    .formkit-form[data-uid="96680ccf0e"] .formkit-submit>span {
      display: block;
      -webkit-transition: all 300ms ease-in-out;
      transition: all 300ms ease-in-out;
      padding: 12px 24px;
    }

    .formkit-form[data-uid="96680ccf0e"] .formkit-input {
      background: #ffffff;
      font-size: 15px;
      padding: 12px;
      border: 1px solid #e3e3e3;
      -webkit-flex: 1 0 auto;
      -ms-flex: 1 0 auto;
      flex: 1 0 auto;
      line-height: 1.4;
      margin: 0;
      -webkit-transition: border-color ease-out 300ms;
      transition: border-color ease-out 300ms;
    }

    .formkit-form[data-uid="96680ccf0e"] .formkit-input:focus {
      outline: none;
      border-color: #1677be;
      -webkit-transition: border-color ease 300ms;
      transition: border-color ease 300ms;
    }

    .formkit-form[data-uid="96680ccf0e"] .formkit-input::-webkit-input-placeholder {
      color: inherit;
      opacity: 0.8;
    }

    .formkit-form[data-uid="96680ccf0e"] .formkit-input::-moz-placeholder {
      color: inherit;
      opacity: 0.8;
    }

    .formkit-form[data-uid="96680ccf0e"] .formkit-input:-ms-input-placeholder {
      color: inherit;
      opacity: 0.8;
    }

    .formkit-form[data-uid="96680ccf0e"] .formkit-input::placeholder {
      color: inherit;
      opacity: 0.8;
    }

    .formkit-form[data-uid="96680ccf0e"] [data-group="dropdown"] {
      position: relative;
      display: inline-block;
      width: 100%;
    }

    .formkit-form[data-uid="96680ccf0e"] [data-group="dropdown"]::before {
      content: "";
      top: calc(50% - 2.5px);
      right: 10px;
      position: absolute;
      pointer-events: none;
      border-color: #4f4f4f transparent transparent transparent;
      border-style: solid;
      border-width: 6px 6px 0 6px;
      height: 0;
      width: 0;
      z-index: 999;
    }

    .formkit-form[data-uid="96680ccf0e"] [data-group="dropdown"] select {
      height: auto;
      width: 100%;
      cursor: pointer;
      color: #333333;
      line-height: 1.4;
      margin-bottom: 0;
      padding: 0 6px;
      -webkit-appearance: none;
      -moz-appearance: none;
      appearance: none;
      font-size: 15px;
      padding: 12px;
      padding-right: 25px;
      border: 1px solid #e3e3e3;
      background: #ffffff;
    }

    .formkit-form[data-uid="96680ccf0e"] [data-group="dropdown"] select:focus {
      outline: none;
    }

    .formkit-form[data-uid="96680ccf0e"] [data-group="checkboxes"] {
      text-align: left;
      margin: 0;
    }

    .formkit-form[data-uid="96680ccf0e"] [data-group="checkboxes"] [data-group="checkbox"] {
      margin-bottom: 10px;
    }

    .formkit-form[data-uid="96680ccf0e"] [data-group="checkboxes"] [data-group="checkbox"] * {
      cursor: pointer;
    }

    .formkit-form[data-uid="96680ccf0e"] [data-group="checkboxes"] [data-group="checkbox"]:last-of-type {
      margin-bottom: 0;
    }

    .formkit-form[data-uid="96680ccf0e"] [data-group="checkboxes"] [data-group="checkbox"] input[type="checkbox"] {
      display: none;
    }

    .formkit-form[data-uid="96680ccf0e"] [data-group="checkboxes"] [data-group="checkbox"] input[type="checkbox"]+label::after {
      content: none;
    }

    .formkit-form[data-uid="96680ccf0e"] [data-group="checkboxes"] [data-group="checkbox"] input[type="checkbox"]:checked+label::after {
      border-color: #ffffff;
      content: "";
    }

    .formkit-form[data-uid="96680ccf0e"] [data-group="checkboxes"] [data-group="checkbox"] input[type="checkbox"]:checked+label::before {
      background: #10bf7a;
      border-color: #10bf7a;
    }

    .formkit-form[data-uid="96680ccf0e"] [data-group="checkboxes"] [data-group="checkbox"] label {
      position: relative;
      display: inline-block;
      padding-left: 28px;
    }

    .formkit-form[data-uid="96680ccf0e"] [data-group="checkboxes"] [data-group="checkbox"] label::before,
    .formkit-form[data-uid="96680ccf0e"] [data-group="checkboxes"] [data-group="checkbox"] label::after {
      position: absolute;
      content: "";
      display: inline-block;
    }

    .formkit-form[data-uid="96680ccf0e"] [data-group="checkboxes"] [data-group="checkbox"] label::before {
      height: 16px;
      width: 16px;
      border: 1px solid #e3e3e3;
      background: #ffffff;
      left: 0px;
      top: 3px;
    }

    .formkit-form[data-uid="96680ccf0e"] [data-group="checkboxes"] [data-group="checkbox"] label::after {
      height: 4px;
      width: 8px;
      border-left: 2px solid #4d4d4d;
      border-bottom: 2px solid #4d4d4d;
      -webkit-transform: rotate(-45deg);
      -ms-transform: rotate(-45deg);
      transform: rotate(-45deg);
      left: 4px;
      top: 8px;
    }

    .formkit-form[data-uid="96680ccf0e"] .formkit-alert {
      background: #f9fafb;
      border: 1px solid #e3e3e3;
      border-radius: 5px;
      -webkit-flex: 1 0 auto;
      -ms-flex: 1 0 auto;
      flex: 1 0 auto;
      list-style: none;
      margin: 25px auto;
      padding: 12px;
      text-align: center;
      width: 100%;
    }

    .formkit-form[data-uid="96680ccf0e"] .formkit-alert:empty {
      display: none;
    }

    .formkit-form[data-uid="96680ccf0e"] .formkit-alert-success {
      background: #d3fbeb;
      border-color: #10bf7a;
      color: #0c905c;
    }

    .formkit-form[data-uid="96680ccf0e"] .formkit-alert-error {
      background: #fde8e2;
      border-color: #f2643b;
      color: #ea4110;
    }

    .formkit-form[data-uid="96680ccf0e"] .formkit-spinner {
      display: -webkit-box;
      display: -webkit-flex;
      display: -ms-flexbox;
      display: flex;
      height: 0px;
      width: 0px;
      margin: 0 auto;
      position: absolute;
      top: 0;
      left: 0;
      right: 0;
      width: 0px;
      overflow: hidden;
      text-align: center;
      -webkit-transition: all 300ms ease-in-out;
      transition: all 300ms ease-in-out;
    }

    .formkit-form[data-uid="96680ccf0e"] .formkit-spinner>div {
      margin: auto;
      width: 12px;
      height: 12px;
      background-color: #fff;
      opacity: 0.3;
      border-radius: 100%;
      display: inline-block;
      -webkit-animation: formkit-bouncedelay-formkit-form-data-uid-96680ccf0e- 1.4s infinite ease-in-out both;
      animation: formkit-bouncedelay-formkit-form-data-uid-96680ccf0e- 1.4s infinite ease-in-out both;
    }

    .formkit-form[data-uid="96680ccf0e"] .formkit-spinner>div:nth-child(1) {
      -webkit-animation-delay: -0.32s;
      animation-delay: -0.32s;
    }

    .formkit-form[data-uid="96680ccf0e"] .formkit-spinner>div:nth-child(2) {
      -webkit-animation-delay: -0.16s;
      animation-delay: -0.16s;
    }

    .formkit-form[data-uid="96680ccf0e"] .formkit-submit[data-active] .formkit-spinner {
      opacity: 1;
      height: 100%;
      width: 50px;
    }

    .formkit-form[data-uid="96680ccf0e"] .formkit-submit[data-active] .formkit-spinner~span {
      opacity: 0;
    }

    .formkit-form[data-uid="96680ccf0e"] .formkit-powered-by[data-active="false"] {
      opacity: 0.35;
    }

    .formkit-form[data-uid="96680ccf0e"] .formkit-powered-by-convertkit-container {
      display: -webkit-box;
      display: -webkit-flex;
      display: -ms-flexbox;
      display: flex;
      width: 100%;
      margin: 10px 0;
      position: relative;
    }

    .formkit-form[data-uid="96680ccf0e"] .formkit-powered-by-convertkit-container[data-active="false"] {
      opacity: 0.35;
    }

    .formkit-form[data-uid="96680ccf0e"] .formkit-powered-by-convertkit {
      -webkit-align-items: center;
      -webkit-box-align: center;
      -ms-flex-align: center;
      align-items: center;
      background-color: #ffffff;
      border-radius: 9px;
      color: #3d3d3d;
      cursor: pointer;
      display: block;
      height: 36px;
      margin: 0 auto;
      opacity: 0.95;
      padding: 0;
      -webkit-text-decoration: none;
      text-decoration: none;
      text-indent: 100%;
      -webkit-transition: ease-in-out all 200ms;
      transition: ease-in-out all 200ms;
      white-space: nowrap;
      overflow: hidden;
      -webkit-user-select: none;
      -moz-user-select: none;
      -ms-user-select: none;
      user-select: none;
      width: 157px;
      background-repeat: no-repeat;
      background-position: center;
      background-image: url("data:image/svg+xml;charset=utf8,%3Csvg width='133' height='36' viewBox='0 0 133 36' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0.861 25.5C0.735 25.5 0.651 25.416 0.651 25.29V10.548C0.651 10.422 0.735 10.338 0.861 10.338H6.279C9.072 10.338 10.668 11.451 10.668 13.824C10.668 15.819 9.219 16.932 8.001 17.226C7.707 17.268 7.707 17.625 8.022 17.688C9.912 18.108 11.088 19.116 11.088 21.321C11.088 23.715 9.429 25.5 6.426 25.5H0.861ZM5.397 23.085C6.825 23.085 7.518 22.224 7.518 21.006C7.518 19.683 6.825 18.948 5.397 18.948H4.2V23.085H5.397ZM5.313 16.617C6.51 16.617 7.245 15.945 7.245 14.601C7.245 13.383 6.51 12.753 5.25 12.753H4.2V16.617H5.313ZM17.9758 23.883C17.9758 23.568 17.6608 23.505 17.5348 23.799C17.0308 24.954 16.1698 25.731 14.5528 25.731C12.8728 25.731 12.0958 24.471 12.0958 22.707V14.937C12.0958 14.811 12.1798 14.727 12.3058 14.727H15.2248C15.3508 14.727 15.4348 14.811 15.4348 14.937V21.657C15.4348 22.581 15.7708 23.022 16.4638 23.022C17.1778 23.022 17.6188 22.581 17.6188 21.657V14.937C17.6188 14.811 17.7028 14.727 17.8288 14.727H20.7478C20.8738 14.727 20.9578 14.811 20.9578 14.937V25.29C20.9578 25.416 20.8738 25.5 20.7478 25.5H18.1858C18.0598 25.5 17.9758 25.416 17.9758 25.29V23.883ZM25.6141 25.29C25.6141 25.416 25.5301 25.5 25.4041 25.5H22.4851C22.3591 25.5 22.2751 25.416 22.2751 25.29V14.937C22.2751 14.811 22.3591 14.727 22.4851 14.727H25.4041C25.5301 14.727 25.6141 14.811 25.6141 14.937V25.29ZM23.9131 13.74C22.8001 13.74 22.0441 12.942 22.0441 11.934C22.0441 10.926 22.8001 10.107 23.9131 10.107C25.0051 10.107 25.7611 10.926 25.7611 11.934C25.7611 12.942 25.0051 13.74 23.9131 13.74ZM26.7883 10.548C26.7883 10.422 26.8723 10.338 26.9983 10.338H29.9173C30.0433 10.338 30.1273 10.422 30.1273 10.548V22.056C30.1273 22.749 30.2533 23.085 30.8203 23.085C31.0093 23.085 31.1983 23.043 31.3663 23.001C31.5133 22.959 31.6183 22.959 31.6183 23.127V25.059C31.6183 25.164 31.5763 25.269 31.4923 25.311C30.9673 25.521 30.2953 25.71 29.5813 25.71C27.7123 25.71 26.7883 24.639 26.7883 22.476V10.548ZM32.4237 14.727C32.8227 14.727 32.9277 14.538 32.9697 14.055L33.1167 12.039C33.1167 11.913 33.2217 11.829 33.3477 11.829H35.8887C36.0147 11.829 36.0987 11.913 36.0987 12.039V14.517C36.0987 14.643 36.1827 14.727 36.3087 14.727H38.2827C38.4087 14.727 38.4927 14.811 38.4927 14.937V16.659C38.4927 16.785 38.4087 16.869 38.2827 16.869H36.0777V22.056C36.0777 22.875 36.5397 23.085 37.0647 23.085C37.4847 23.085 37.9467 22.938 38.3247 22.707C38.4717 22.623 38.5767 22.665 38.5767 22.833V24.828C38.5767 24.933 38.5347 25.017 38.4507 25.08C37.8417 25.458 36.9807 25.71 36.0357 25.71C34.2927 25.71 32.7387 24.912 32.7387 22.476V16.869H31.8567C31.7307 16.869 31.6467 16.785 31.6467 16.659V14.937C31.6467 14.811 31.7307 14.727 31.8567 14.727H32.4237ZM51.3808 14.727C51.5068 14.727 51.5908 14.79 51.6118 14.916L52.3888 19.851L52.5778 21.174C52.6198 21.468 52.9558 21.468 52.9768 21.174C53.0398 20.712 53.0818 20.271 53.1658 19.83L53.8798 14.916C53.9008 14.79 53.9848 14.727 54.1108 14.727H56.6728C56.8198 14.727 56.8828 14.811 56.8618 14.958L54.6778 25.311C54.6568 25.437 54.5728 25.5 54.4468 25.5H51.3178C51.1918 25.5 51.1078 25.437 51.0868 25.311L50.1208 20.082L49.8898 18.633C49.8688 18.444 49.6588 18.444 49.6378 18.633L49.4068 20.103L48.5458 25.311C48.5248 25.437 48.4408 25.5 48.3148 25.5H45.2068C45.0808 25.5 44.9968 25.437 44.9758 25.311L42.8128 14.958C42.7918 14.811 42.8548 14.727 43.0018 14.727H45.9628C46.0888 14.727 46.1728 14.79 46.1938 14.916L46.9288 19.83C47.0128 20.271 47.0758 20.754 47.1388 21.195C47.2018 21.51 47.4748 21.531 47.5378 21.195L47.7478 19.872L48.6088 14.916C48.6298 14.79 48.7138 14.727 48.8398 14.727H51.3808ZM61.1582 25.29C61.1582 25.416 61.0742 25.5 60.9482 25.5H58.0292C57.9032 25.5 57.8192 25.416 57.8192 25.29V14.937C57.8192 14.811 57.9032 14.727 58.0292 14.727H60.9482C61.0742 14.727 61.1582 14.811 61.1582 14.937V25.29ZM59.4572 13.74C58.3442 13.74 57.5882 12.942 57.5882 11.934C57.5882 10.926 58.3442 10.107 59.4572 10.107C60.5492 10.107 61.3052 10.926 61.3052 11.934C61.3052 12.942 60.5492 13.74 59.4572 13.74ZM62.8154 14.727C63.2144 14.727 63.3194 14.538 63.3614 14.055L63.5084 12.039C63.5084 11.913 63.6134 11.829 63.7394 11.829H66.2804C66.4064 11.829 66.4904 11.913 66.4904 12.039V14.517C66.4904 14.643 66.5744 14.727 66.7004 14.727H68.6744C68.8004 14.727 68.8844 14.811 68.8844 14.937V16.659C68.8844 16.785 68.8004 16.869 68.6744 16.869H66.4694V22.056C66.4694 22.875 66.9314 23.085 67.4564 23.085C67.8764 23.085 68.3384 22.938 68.7164 22.707C68.8634 22.623 68.9684 22.665 68.9684 22.833V24.828C68.9684 24.933 68.9264 25.017 68.8424 25.08C68.2334 25.458 67.3724 25.71 66.4274 25.71C64.6844 25.71 63.1304 24.912 63.1304 22.476V16.869H62.2484C62.1224 16.869 62.0384 16.785 62.0384 16.659V14.937C62.0384 14.811 62.1224 14.727 62.2484 14.727H62.8154ZM73.4298 16.323C73.4298 16.638 73.7868 16.68 73.9128 16.407C74.3748 15.315 75.1308 14.496 76.6008 14.496C78.2178 14.496 78.9528 15.609 78.9528 17.373V25.29C78.9528 25.416 78.8688 25.5 78.7428 25.5H75.8238C75.6978 25.5 75.6138 25.416 75.6138 25.29V18.633C75.6138 17.709 75.2778 17.268 74.5848 17.268C73.8708 17.268 73.4298 17.709 73.4298 18.633V25.29C73.4298 25.416 73.3458 25.5 73.2198 25.5H70.3008C70.1748 25.5 70.0908 25.416 70.0908 25.29V10.548C70.0908 10.422 70.1748 10.338 70.3008 10.338H73.2198C73.3458 10.338 73.4298 10.422 73.4298 10.548V16.323Z' fill='%231E1E1E'/%3E%3Cpath d='M100.132 16.3203C105.58 17.3761 107.272 22.4211 107.318 27.4961C107.318 27.6101 107.226 27.7041 107.112 27.7041H100.252C100.138 27.7041 100.046 27.6121 100.046 27.5001C100.026 23.5629 99.3877 20.0896 95.4865 19.9396C95.3705 19.9356 95.2725 20.0276 95.2725 20.1456V27.5001C95.2725 27.6141 95.1806 27.7061 95.0666 27.7061H88.206C88.092 27.7061 88 27.6141 88 27.5001V8.75585C88 8.64187 88.092 8.54989 88.206 8.54989H95.0686C95.1826 8.54989 95.2745 8.64187 95.2745 8.75585V15.7764C95.2745 15.8804 95.3585 15.9644 95.4625 15.9644C95.5445 15.9644 95.6185 15.9104 95.6425 15.8324C97.4081 10.0416 100.709 8.58588 106.07 8.55189C106.184 8.55189 106.276 8.64387 106.276 8.75785V15.7604C106.276 15.8744 106.184 15.9664 106.07 15.9664H100.166C100.066 15.9664 99.9856 16.0464 99.9856 16.1464C99.9856 16.2304 100.048 16.3043 100.132 16.3203ZM118.918 20.7095V16.1704C118.918 16.0564 119.01 15.9644 119.124 15.9644H124.173C124.273 15.9644 124.353 15.8844 124.353 15.7844C124.353 15.6985 124.291 15.6245 124.207 15.6085C120.256 14.8246 118.432 12.5511 118.37 8.75585C118.368 8.64387 118.458 8.54989 118.572 8.54989H125.986C126.1 8.54989 126.192 8.64187 126.192 8.75585V11.9532C126.192 12.0672 126.284 12.1592 126.398 12.1592H130.649C130.763 12.1592 130.855 12.2511 130.855 12.3651V15.7624C130.855 15.8764 130.763 15.9684 130.649 15.9684H126.398C126.284 15.9684 126.192 16.0604 126.192 16.1744V19.8356C126.192 21.1294 126.986 21.5553 128.04 21.5553C129.692 21.5553 131.323 20.8114 131.977 20.4735C132.113 20.4035 132.277 20.5015 132.277 20.6555V26.3543C132.277 26.5063 132.193 26.6463 132.059 26.7183C131.413 27.0582 129.418 28 127.136 28C122.435 27.996 118.918 26.0824 118.918 20.7095ZM109.266 27.4981V16.1704C109.266 16.0564 109.358 15.9644 109.472 15.9644H116.334C116.448 15.9644 116.54 16.0564 116.54 16.1704V27.4981C116.54 27.6121 116.448 27.7041 116.334 27.7041H109.472C109.358 27.7021 109.266 27.6101 109.266 27.4981ZM108.876 11.4913C108.876 13.4189 110.238 14.9826 112.853 14.9826C115.469 14.9826 116.83 13.4189 116.83 11.4913C116.83 9.56369 115.471 8 112.853 8C110.238 8 108.876 9.56369 108.876 11.4913Z' fill='%231E1E1E'/%3E%3C/svg%3E");
    }

    .formkit-form[data-uid="96680ccf0e"] .formkit-powered-by-convertkit:hover,
    .formkit-form[data-uid="96680ccf0e"] .formkit-powered-by-convertkit:focus {
      background-color: #ffffff;
      -webkit-transform: scale(1.025) perspective(1px);
      -ms-transform: scale(1.025) perspective(1px);
      transform: scale(1.025) perspective(1px);
      opacity: 1;
    }

    .formkit-form[data-uid="96680ccf0e"] .formkit-powered-by-convertkit[data-variant="dark"],
    .formkit-form[data-uid="96680ccf0e"] .formkit-powered-by-convertkit[data-variant="light"] {
      background-color: transparent;
      border-color: transparent;
      width: 133px;
    }

    .formkit-form[data-uid="96680ccf0e"] .formkit-powered-by-convertkit[data-variant="light"] {
      color: #ffffff;
      background-image: url("data:image/svg+xml;charset=utf8,%3Csvg width='133' height='36' viewBox='0 0 133 36' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0.861 25.5C0.735 25.5 0.651 25.416 0.651 25.29V10.548C0.651 10.422 0.735 10.338 0.861 10.338H6.279C9.072 10.338 10.668 11.451 10.668 13.824C10.668 15.819 9.219 16.932 8.001 17.226C7.707 17.268 7.707 17.625 8.022 17.688C9.912 18.108 11.088 19.116 11.088 21.321C11.088 23.715 9.429 25.5 6.426 25.5H0.861ZM5.397 23.085C6.825 23.085 7.518 22.224 7.518 21.006C7.518 19.683 6.825 18.948 5.397 18.948H4.2V23.085H5.397ZM5.313 16.617C6.51 16.617 7.245 15.945 7.245 14.601C7.245 13.383 6.51 12.753 5.25 12.753H4.2V16.617H5.313ZM17.9758 23.883C17.9758 23.568 17.6608 23.505 17.5348 23.799C17.0308 24.954 16.1698 25.731 14.5528 25.731C12.8728 25.731 12.0958 24.471 12.0958 22.707V14.937C12.0958 14.811 12.1798 14.727 12.3058 14.727H15.2248C15.3508 14.727 15.4348 14.811 15.4348 14.937V21.657C15.4348 22.581 15.7708 23.022 16.4638 23.022C17.1778 23.022 17.6188 22.581 17.6188 21.657V14.937C17.6188 14.811 17.7028 14.727 17.8288 14.727H20.7478C20.8738 14.727 20.9578 14.811 20.9578 14.937V25.29C20.9578 25.416 20.8738 25.5 20.7478 25.5H18.1858C18.0598 25.5 17.9758 25.416 17.9758 25.29V23.883ZM25.6141 25.29C25.6141 25.416 25.5301 25.5 25.4041 25.5H22.4851C22.3591 25.5 22.2751 25.416 22.2751 25.29V14.937C22.2751 14.811 22.3591 14.727 22.4851 14.727H25.4041C25.5301 14.727 25.6141 14.811 25.6141 14.937V25.29ZM23.9131 13.74C22.8001 13.74 22.0441 12.942 22.0441 11.934C22.0441 10.926 22.8001 10.107 23.9131 10.107C25.0051 10.107 25.7611 10.926 25.7611 11.934C25.7611 12.942 25.0051 13.74 23.9131 13.74ZM26.7883 10.548C26.7883 10.422 26.8723 10.338 26.9983 10.338H29.9173C30.0433 10.338 30.1273 10.422 30.1273 10.548V22.056C30.1273 22.749 30.2533 23.085 30.8203 23.085C31.0093 23.085 31.1983 23.043 31.3663 23.001C31.5133 22.959 31.6183 22.959 31.6183 23.127V25.059C31.6183 25.164 31.5763 25.269 31.4923 25.311C30.9673 25.521 30.2953 25.71 29.5813 25.71C27.7123 25.71 26.7883 24.639 26.7883 22.476V10.548ZM32.4237 14.727C32.8227 14.727 32.9277 14.538 32.9697 14.055L33.1167 12.039C33.1167 11.913 33.2217 11.829 33.3477 11.829H35.8887C36.0147 11.829 36.0987 11.913 36.0987 12.039V14.517C36.0987 14.643 36.1827 14.727 36.3087 14.727H38.2827C38.4087 14.727 38.4927 14.811 38.4927 14.937V16.659C38.4927 16.785 38.4087 16.869 38.2827 16.869H36.0777V22.056C36.0777 22.875 36.5397 23.085 37.0647 23.085C37.4847 23.085 37.9467 22.938 38.3247 22.707C38.4717 22.623 38.5767 22.665 38.5767 22.833V24.828C38.5767 24.933 38.5347 25.017 38.4507 25.08C37.8417 25.458 36.9807 25.71 36.0357 25.71C34.2927 25.71 32.7387 24.912 32.7387 22.476V16.869H31.8567C31.7307 16.869 31.6467 16.785 31.6467 16.659V14.937C31.6467 14.811 31.7307 14.727 31.8567 14.727H32.4237ZM51.3808 14.727C51.5068 14.727 51.5908 14.79 51.6118 14.916L52.3888 19.851L52.5778 21.174C52.6198 21.468 52.9558 21.468 52.9768 21.174C53.0398 20.712 53.0818 20.271 53.1658 19.83L53.8798 14.916C53.9008 14.79 53.9848 14.727 54.1108 14.727H56.6728C56.8198 14.727 56.8828 14.811 56.8618 14.958L54.6778 25.311C54.6568 25.437 54.5728 25.5 54.4468 25.5H51.3178C51.1918 25.5 51.1078 25.437 51.0868 25.311L50.1208 20.082L49.8898 18.633C49.8688 18.444 49.6588 18.444 49.6378 18.633L49.4068 20.103L48.5458 25.311C48.5248 25.437 48.4408 25.5 48.3148 25.5H45.2068C45.0808 25.5 44.9968 25.437 44.9758 25.311L42.8128 14.958C42.7918 14.811 42.8548 14.727 43.0018 14.727H45.9628C46.0888 14.727 46.1728 14.79 46.1938 14.916L46.9288 19.83C47.0128 20.271 47.0758 20.754 47.1388 21.195C47.2018 21.51 47.4748 21.531 47.5378 21.195L47.7478 19.872L48.6088 14.916C48.6298 14.79 48.7138 14.727 48.8398 14.727H51.3808ZM61.1582 25.29C61.1582 25.416 61.0742 25.5 60.9482 25.5H58.0292C57.9032 25.5 57.8192 25.416 57.8192 25.29V14.937C57.8192 14.811 57.9032 14.727 58.0292 14.727H60.9482C61.0742 14.727 61.1582 14.811 61.1582 14.937V25.29ZM59.4572 13.74C58.3442 13.74 57.5882 12.942 57.5882 11.934C57.5882 10.926 58.3442 10.107 59.4572 10.107C60.5492 10.107 61.3052 10.926 61.3052 11.934C61.3052 12.942 60.5492 13.74 59.4572 13.74ZM62.8154 14.727C63.2144 14.727 63.3194 14.538 63.3614 14.055L63.5084 12.039C63.5084 11.913 63.6134 11.829 63.7394 11.829H66.2804C66.4064 11.829 66.4904 11.913 66.4904 12.039V14.517C66.4904 14.643 66.5744 14.727 66.7004 14.727H68.6744C68.8004 14.727 68.8844 14.811 68.8844 14.937V16.659C68.8844 16.785 68.8004 16.869 68.6744 16.869H66.4694V22.056C66.4694 22.875 66.9314 23.085 67.4564 23.085C67.8764 23.085 68.3384 22.938 68.7164 22.707C68.8634 22.623 68.9684 22.665 68.9684 22.833V24.828C68.9684 24.933 68.9264 25.017 68.8424 25.08C68.2334 25.458 67.3724 25.71 66.4274 25.71C64.6844 25.71 63.1304 24.912 63.1304 22.476V16.869H62.2484C62.1224 16.869 62.0384 16.785 62.0384 16.659V14.937C62.0384 14.811 62.1224 14.727 62.2484 14.727H62.8154ZM73.4298 16.323C73.4298 16.638 73.7868 16.68 73.9128 16.407C74.3748 15.315 75.1308 14.496 76.6008 14.496C78.2178 14.496 78.9528 15.609 78.9528 17.373V25.29C78.9528 25.416 78.8688 25.5 78.7428 25.5H75.8238C75.6978 25.5 75.6138 25.416 75.6138 25.29V18.633C75.6138 17.709 75.2778 17.268 74.5848 17.268C73.8708 17.268 73.4298 17.709 73.4298 18.633V25.29C73.4298 25.416 73.3458 25.5 73.2198 25.5H70.3008C70.1748 25.5 70.0908 25.416 70.0908 25.29V10.548C70.0908 10.422 70.1748 10.338 70.3008 10.338H73.2198C73.3458 10.338 73.4298 10.422 73.4298 10.548V16.323Z' fill='white'/%3E%3Cpath d='M100.132 16.3203C105.58 17.3761 107.272 22.4211 107.318 27.4961C107.318 27.6101 107.226 27.7041 107.112 27.7041H100.252C100.138 27.7041 100.046 27.6121 100.046 27.5001C100.026 23.5629 99.3877 20.0896 95.4865 19.9396C95.3705 19.9356 95.2725 20.0276 95.2725 20.1456V27.5001C95.2725 27.6141 95.1806 27.7061 95.0666 27.7061H88.206C88.092 27.7061 88 27.6141 88 27.5001V8.75585C88 8.64187 88.092 8.54989 88.206 8.54989H95.0686C95.1826 8.54989 95.2745 8.64187 95.2745 8.75585V15.7764C95.2745 15.8804 95.3585 15.9644 95.4625 15.9644C95.5445 15.9644 95.6185 15.9104 95.6425 15.8324C97.4081 10.0416 100.709 8.58588 106.07 8.55189C106.184 8.55189 106.276 8.64387 106.276 8.75785V15.7604C106.276 15.8744 106.184 15.9664 106.07 15.9664H100.166C100.066 15.9664 99.9856 16.0464 99.9856 16.1464C99.9856 16.2304 100.048 16.3043 100.132 16.3203ZM118.918 20.7095V16.1704C118.918 16.0564 119.01 15.9644 119.124 15.9644H124.173C124.273 15.9644 124.353 15.8844 124.353 15.7844C124.353 15.6985 124.291 15.6245 124.207 15.6085C120.256 14.8246 118.432 12.5511 118.37 8.75585C118.368 8.64387 118.458 8.54989 118.572 8.54989H125.986C126.1 8.54989 126.192 8.64187 126.192 8.75585V11.9532C126.192 12.0672 126.284 12.1592 126.398 12.1592H130.649C130.763 12.1592 130.855 12.2511 130.855 12.3651V15.7624C130.855 15.8764 130.763 15.9684 130.649 15.9684H126.398C126.284 15.9684 126.192 16.0604 126.192 16.1744V19.8356C126.192 21.1294 126.986 21.5553 128.04 21.5553C129.692 21.5553 131.323 20.8114 131.977 20.4735C132.113 20.4035 132.277 20.5015 132.277 20.6555V26.3543C132.277 26.5063 132.193 26.6463 132.059 26.7183C131.413 27.0582 129.418 28 127.136 28C122.435 27.996 118.918 26.0824 118.918 20.7095ZM109.266 27.4981V16.1704C109.266 16.0564 109.358 15.9644 109.472 15.9644H116.334C116.448 15.9644 116.54 16.0564 116.54 16.1704V27.4981C116.54 27.6121 116.448 27.7041 116.334 27.7041H109.472C109.358 27.7021 109.266 27.6101 109.266 27.4981ZM108.876 11.4913C108.876 13.4189 110.238 14.9826 112.853 14.9826C115.469 14.9826 116.83 13.4189 116.83 11.4913C116.83 9.56369 115.471 8 112.853 8C110.238 8 108.876 9.56369 108.876 11.4913Z' fill='white'/%3E%3C/svg%3E");
    }

    @-webkit-keyframes formkit-bouncedelay-formkit-form-data-uid-96680ccf0e- {

      0%,
      80%,
      100% {
        -webkit-transform: scale(0);
        -ms-transform: scale(0);
        transform: scale(0);
      }

      40% {
        -webkit-transform: scale(1);
        -ms-transform: scale(1);
        transform: scale(1);
      }
    }

    @keyframes formkit-bouncedelay-formkit-form-data-uid-96680ccf0e- {

      0%,
      80%,
      100% {
        -webkit-transform: scale(0);
        -ms-transform: scale(0);
        transform: scale(0);
      }

      40% {
        -webkit-transform: scale(1);
        -ms-transform: scale(1);
        transform: scale(1);
      }
    }

    .formkit-form[data-uid="96680ccf0e"] blockquote {
      padding: 10px 20px;
      margin: 0 0 20px;
      border-left: 5px solid #e1e1e1;
    }

    .formkit-form[data-uid="96680ccf0e"] .seva-custom-content {
      padding: 15px;
      font-size: 16px;
      color: #fff;
      mix-blend-mode: difference;
    }

    .formkit-form[data-uid="96680ccf0e"] .formkit-modal.guard {
      max-width: 420px;
      width: 100%;
    }

    .formkit-form[data-uid="96680ccf0e"] {
      max-width: 700px;
    }

    .formkit-form[data-uid="96680ccf0e"] [data-style="clean"] {
      width: 100%;
    }

    .formkit-form[data-uid="96680ccf0e"] .formkit-fields {
      display: -webkit-box;
      display: -webkit-flex;
      display: -ms-flexbox;
      display: flex;
      -webkit-flex-wrap: wrap;
      -ms-flex-wrap: wrap;
      flex-wrap: wrap;
      margin: 0 auto;
    }

    .formkit-form[data-uid="96680ccf0e"] .formkit-field,
    .formkit-form[data-uid="96680ccf0e"] .formkit-submit {
      margin: 0 0 15px 0;
      -webkit-flex: 1 0 100%;
      -ms-flex: 1 0 100%;
      flex: 1 0 100%;
    }

    .formkit-form[data-uid="96680ccf0e"] .formkit-powered-by-convertkit-container {
      margin: 0;
    }

    .formkit-form[data-uid="96680ccf0e"] .formkit-submit {
      position: static;
    }

    .formkit-form[data-uid="96680ccf0e"][min-width~="700"] [data-style="clean"],
    .formkit-form[data-uid="96680ccf0e"][min-width~="800"] [data-style="clean"] {
      padding: 10px;
      padding-top: 56px;
    }

    .formkit-form[data-uid="96680ccf0e"][min-width~="700"] .formkit-fields[data-stacked="false"],
    .formkit-form[data-uid="96680ccf0e"][min-width~="800"] .formkit-fields[data-stacked="false"] {
      margin-left: -5px;
      margin-right: -5px;
    }

    .formkit-form[data-uid="96680ccf0e"][min-width~="700"] .formkit-fields[data-stacked="false"] .formkit-field,
    .formkit-form[data-uid="96680ccf0e"][min-width~="800"] .formkit-fields[data-stacked="false"] .formkit-field,
    .formkit-form[data-uid="96680ccf0e"][min-width~="700"] .formkit-fields[data-stacked="false"] .formkit-submit,
    .formkit-form[data-uid="96680ccf0e"][min-width~="800"] .formkit-fields[data-stacked="false"] .formkit-submit {
      margin: 0 5px 15px 5px;
    }

    .formkit-form[data-uid="96680ccf0e"][min-width~="700"] .formkit-fields[data-stacked="false"] .formkit-field,
    .formkit-form[data-uid="96680ccf0e"][min-width~="800"] .formkit-fields[data-stacked="false"] .formkit-field {
      -webkit-flex: 100 1 auto;
      -ms-flex: 100 1 auto;
      flex: 100 1 auto;
    }

    .formkit-form[data-uid="96680ccf0e"][min-width~="700"] .formkit-fields[data-stacked="false"] .formkit-submit,
    .formkit-form[data-uid="96680ccf0e"][min-width~="800"] .formkit-fields[data-stacked="false"] .formkit-submit {
      -webkit-flex: 1 1 auto;
      -ms-flex: 1 1 auto;
      flex: 1 1 auto;
    }

    .formkit-form[data-uid="96680ccf0e"] .formkit-fields button {
      padding-top: 4px;
      padding-bottom: 4px;
    }
  </style>
</form>

Text Content

Existing customer?
Login here
Login


Can I have a sample?
I'm Ready to Purchase


LEARN HOW TO TEST REAL, COMPLEX SOFTWARE WRITTEN IN GO


LARGE OR SMALL, PERFECT ABSTRACTIONS OR GLOBAL STATE GALORE; IT DOESN'T MATTER
WHAT YOUR CODE LOOKS LIKE, YOU CAN LEARN TO TEST IT.

Tell me if this sounds familiar - you are learning how to test in Go, and things
seem to be going great. The tutorials are all clicking, and you can't wait to
start applying what you are learning in your real projects.

You fire up your editor, grab your latest project, create your first *_test.go
source file, and suddenly it feels like you don't have a clue what you are
doing.

*You hear the sound of glass shattering*


WHAT HAPPENED?!?!

Things were going so great. All those examples made sense, but now you don't
even know where to start.

It seemed so easy to test that "Hello, world" HTTP handler, but how do you test
complex handlers? You know, HTTP handlers that do something realistic like
insert a record into a database, or use an API to verify someone's address.

For that matter, how do we verify that our database interactions are working as
we expected? Or maybe your app has a global DB variable - does that mean testing
simply isn't possible?

What about those APIs we are interacting with? Do we stub them? Do we hit the
test API? What happens if we hit API rate limits or there isn't even a test API?

Alright, alright! Take a second to breathe and let me fill you in on a little
secret...


TESTING ISN'T HARD, BUT SIMPLE TUTORIALS DON'T DO IT JUSTICE

Testing isn't any harder than writing any other Go code. In fact, if we wanted
we could test our code by just writing a main package and interacting with our
application code. We could panic when something doesn't act the way we expected,
and viola - we have a test!

But why does it feel so hard? Probably because we simplify the examples to the
point that they lose all of their value.

Think about it, when is the last time you wrote a Palindrome function?

Never? So why are all these tutorials showing us how to test one?

Why aren't they showing us how to test realistic software? What happened to the
example where we test a real HTTP handler that needs access to a data store? Or
the tutorial where we build an API client and learn how to test it WITHOUT
always hitting the real API. Wouldn't it be great if we could learn how to test
a real web app with a real DB and a real integration to a payments API like
Stripe?


TEST WITH GO IS DIFFERENT.

In this course you will learn how to test REAL software, not palindrome
functions.

We will have to look at a few isolated examples in order to learn specific
testing techniques, but that isn't enough to solidify a concept so we won't stop
there. We will build real projects that teach you how to apply all of these
testing skills in real software.

In one project we build a web application which allows us to address the
complexities that come up while testing an application that uses a database,
third party APIs, and more. In another project we look at how internal testing
helps us verify our intermediate steps are correct, while also discussing the
downside to testing unexported functions.

You will learn about common pitfalls to avoid in order to write more testable
code. You will learn how to incrementally fix code that has already succumbed to
many of these pitfalls, allowing you to avoid a massive PR that makes your
reviewer cry inside.

When you run into an application with a global DB variable you won't need to
give up on testing. You will learn exactly how to make small, manageable changes
to the code that allow you to start testing it almost immediately.

The next time you are asked whether the data store should be mocked or if a real
SQL database should be used you will be able to discuss the pros and cons of
both approaches with your teammates and decide on a proper plan of action.

After completing this course you will have the knowledge and the skills
necessary to start testing your own projects. You will still have to put in the
work, but the mystery, the confusion, and the frustration will be gone.

In short, you will be on your way to becoming the de facto testing expert on
your team. You will be on the path to making your team's software a happier,
healthier place to spend your day. Heck, you might even be on your way to a
raise or a better offer! 😉



Want a sample of the course?

 REQUEST A SAMPLE 

or learn about the course below






COURSE OVERVIEW

Test with Go is broken into two major sections: Lessons and Projects

Put together, the lessons and projects span 173 videos and total over 33 hours
of content.



In the lessons we focus on learning the techniques necessary to test our
applications. We will learn the basics, like how to write your first test and
what table driven testing is, but we will also cover more advanced testing
techniques like:

 * Testing race conditions
 * Dependency injection
 * Mocks, stubs, and fakes
 * Testing with HTTP
 * And many more!

We will spend some time using small, isolated examples in order to learn each
technique, but those will gradually become more realistic as you become familiar
with testing. Before long we will be looking at tests that use a real SQL
database, test helpers that enable us to test HTTP endpoints that require
authentication, and more.



In the projects we will take everything we learned in the lessons and practice
applying them while building real software. We will look at some of the most
common mistakes you can make when designing an application, as well as how to
gradually refactor your code to make it more testable. We will see first-hand
how to separate your integration and unit tests, allowing you to write tests for
an API client that can both be run locally and online with the real API. We will
even look at how to export some of those helper functions, making it easier for
others who use your libraries to write tests.



More can be seen in the individual Lessons and Projects sections below.


“
”
I finished my internship this week. The knowledge I got from your book helped me
get a better offer (compared to the average around here), and I'm glad. Thank
you.
Jonathan B.

Software Engineer



THE LESSONS

The lessons consist of 88 videos that will gradually walk you from the most
basic exercise - like writing your first test - all the way to advanced
techniques like interface test suites, dependency injection, and more.

All of the lessons are broken into sections, making it easier to quickly jump to
the subject you want to learn or review. That means in a few years when you want
a quick reminder on testing subprocesses you can quickly find the section you
need and get back to testing your code with minimal downtime.




SECTION 1: WHAT IS TESTING, AND WHY DOES IT MATTER?

What is a test?

Why do tests matter?

Writing great tests




SECTION 2: TESTS ARE JUST GO CODE

Testing with a main package

Testing with Gos testing package

What happens when we run go test




SECTION 3: NAMING CONVENTIONS

File naming conventions

Function naming conventions

Variable naming conventions




SECTION 4: FAILING TESTS

Ways to signal test failure

When to use Error vs Fatal

Writing useful failure messages




SECTION 5: EXAMPLES AS TEST CASES

A basic example as a test case

Viewing examples in the docs

Unordered example output

Complex examples

Examples in the standard library




SECTION 6: TESTING MULTIPLE CASES

Table driven tests

Generating table driven test code

Subtests

Shared setup and teardown

TestMain




SECTION 7: PARALLEL TESTS

Running tests in parallel

Parallel subtests

Setup and teardown with parallel subtests

Gotchas with closures and parallel tests




SECTION 8: TESTING RACE CONDITIONS

What is a race condition

The race detection flag

Testing explicitly for race conditions




SECTION 9: COMPARING OBJECTS FOR EQUALITY

Simple comparisons

Reflect's DeepEqual function

Golden files (brief overview)

Helper comparison functions




SECTION 10: TESTING UTILITIES

Building things with helper functions

Generating test data

Gos quick testing package

Public testing utilities




SECTION 11: CONTROLLING WHICH TESTS ARE RUN

Running specific tests

Running tests for subpackages

Skipping tests

Custom flags

Build tags




SECTION 12: ADDITIONAL TESTING FLAGS

Benchmarks

Verbose testing

Code coverage

The timeout flag

Parallel testing flags




SECTION 13: EXTERNAL AND INTERNAL TESTING

Differences between external and internal

How to write internal and external tests

When to use external tests

Exporting unexported vars, funcs, and types

When to use internal tests




SECTION 14: TYPES OF TESTS

Overview of test types

Unit tests

Integration tests

End-to-end tests

Which test type should I use




SECTION 15: STATE

What is global state

Testing with global state (if you must)




SECTION 16: DEPENDENCY INJECTION (DI)

What is dependency injection

DI enables implementation agnostic code

DI makes testing easier

DI and useful zero values

Removing global state with DI

Package level functions

Summary of DI




SECTION 17: MOCKS, STUBS, AND FAKES

What is mocking

Types of mock objects

Why do we mock

Third party packages

Faking APIs




SECTION 18: INTERFACE TEST SUITES

What are interface test suites

Interface test suite setup and teardown

Interface test suites in the wild




SECTION 19: TESTING WITH HTTP

httptest.ResponseRecorder

httptest.Server

Build HTTP helpers




SECTION 20: GOLDEN FILES

What are golden files

Updating golden files




SECTION 21: TESTING SUBPROCESSES

What is a subprocess

Running the subprocess in tests

Mocking simple subprocesses

Mocking complex subprocesses




SECTION 22: TESTING WITH TIME

Why are dates and times problematic?

Inject your time and sleep functions

Testing timeouts




SECTION 23: BONUS MATERIAL

Colorizing your terminal output

Coverage info function


“
”
I realize you are looking for ways to improve, but I don’t have anything
negative to say about the videos you sent me to review. I love your approach in
these lessons. Everything is explained well and I can’t wait for the course
release!
Nestoras Stefanou

Software Engineer


THE PROJECTS

There are three projects in this course:

 * form - a Go package (AKA a library) used to generate HTML forms from Go
   structs
 * stripe - an API client used to interact with a few of the Stripe payment API
   endpoints
 * swag - a web application that allows users to order sticker packs using both
   the form and stripe packages we create in the first two projects

Each project is built from the ground up with the goal of teaching you about
testing in real software. For instance, we will intentionally make mistakes that
make our code hard to test then explore ways to make it more testable. Or in
other instances we might discuss the tradeoffs of one approach vs another before
ultimately moving forward and writing any code.

The videos for each project are shown below, and if you have any questions don't
hesitate to reach out and ask.

*The projects are only included in the COMPLETE package




PROJECT 1: FORM

A Go package (AKA a library) used to generate HTML forms from Go structs

01. Topics covered in the form project

02. The first test

03. Our first bug

04. Handling multiple fields

05. Field values

06. Checking for specific attributes in a test

07. Unexported fields

08. Non-structs are invalid

09. Pointers to structs

10. Supporting more types

11. Generating HTML

12. Discussing struct tags and tests

13. Parsing struct tags

14. Applying struct tags

15. Golden test files

16. Struct tag tests in TestHTML

17. Rendering errors

18. Rendering errors

19. Detecting breaking changes with tests




PROJECT 2: STRIPE

An API client used to interact with a few of the Stripe payment API endpoints

01. The first test

02. Creating a customer

03. Versioning our client

04. Making the API key a flag

05. Improving our customer data

06. The charge endpoint

07. Custom error type

08. Parsing stripe errors

09. Customer endpoint errors

10. Starting on unit tests

11. Allowing customer http clients

12. Creating a recorder client

13. Persisting recorded responses

14. Making our tests cross-platform

15. Serving recorded responses

16. Unique customer per charge subtest

17. Adding tests for specific errors

18. Helper functions




PROJECT 3: SWAG

In this project we explore how we might approach adding tests and refactoring a
web application that wasn't designed with testing in mind. We look at how to
incrementally add tests and make changes so we avoid breaking any functionality
or needing to make massive overhauls to the code.

The web app we add tests to allows users to order sticker packs using both the
form and stripe packages we create in the first two projects

01. What to expect

02. App overview

03. Initial db tests

04. Creating the db.Open function

05. What about mocks

06. Test harnesses and helpers

07. Reviewing tests

08. Testing specific times

09. First pass at refactoring the db pkg

10. Updating db tests

11. Testing the order flow

12. Extracting code for unit testing

13. Extracting the active campaign handler

14. Unit testing the active campaign handler

15. Table driven testing the active campaign handler

16. Refactoring campaign middleware

17. Unit testing the campaign middleware

18. Starting the orders handler

19. Testing the new order handler

20. Refactor Create order handler

21. Test: Create order handler

22. Integration testing with Stripe

23. Testing for specific Stripe failures

24. Another form of table driven tests

25. Refactor: Order middleware

26. Test: Order middleware

27. Refactor: Show order handler

28. Test: Show order handler

29. Don't get too clever

30. Integration testing the show order handler

31. Removing sql from the confirm order handler

32. Testing the database confirm order function

33. Refactor: Confirm order handler

34. Test: Confirm order handler with same address

35. Test: Confirm order handler when campaign isnt found

36. Refactoring and finishing the confirm order handler unit tests

37. Integration test: Confirm order handler

38. Setting the stripe secret key via ENV variable

39. Refactoring the routing code in main

40. Testing our asset directory

41. Mocks for testing our router

42. Testing the show order route

43. Table driven router testing

44. Additional router testing

45. Removing the tempDB type

46. Removing the DefaultDatabase package variable

47. Cleanup

48. Wrapping up





“
”
I expected to learn some useful testing techniques and strategies, which I most
definitely did, but thinking about what Jon teaches in this course has begun to
change the way I think about writing code in general; an unexpected benefit.
Thomas

Software Engineer


COURSE PACKAGES

Complete Package

Access to everything. The lessons, the projects, the source code, and future
updates.
173 videos totalling over 33 hours of content.
Stream or download the videos from any device. You could be learning to test
with Go even when you don't have internet access!

(Questions about the video format?)
Access to all the source code used in the course
Free course updates - anytime I update or add any new content you will get
instant access to it. That include new lessons, projects, etc.
Learn how to test a Stripe payments API integration
Access to the exclusive Test with Go course Slack. Ask questions and learn with
both me and others who purchased the course
Get the Complete Package $249
Lessons Package

Access to all the lessons and their corresponding source code.

88 videos totalling over 13 hours of content
Stream the videos from any device

Access to all the source code used in the lessons
Free lesson updates - anytime I update the lessons you will get instant access
to the updated material


Access to the exclusive Test with Go course Slack. Ask questions and learn with
both me and others who purchased the course
Get the Lessons Package $149



BUYING MORE THAN ONE COPY?

In addition to individual packages, I also offer team packages. These include
everything in the complete package, but you get a discount for buying multiple
copies. You can reach out to discuss a team package that fits your team's needs.



“
”
You have the best practical learning materials available. I've been studying Go
for more then one year and saw lots of materials. But yours stuff is the best!
Alex D.

Software Engineer

FAQ


FREQUENTLY ASKED QUESTIONS


WHAT IF I DON'T LIKE IT?

I offer a 30 day money back guarantee. If you are unsure about the course, I
recommend purchasing the package you feel is best and streaming a few of the
videos to see if the course is right for you. If it isn't, send me an email
within 30 days and I'll issue you a refund.

This only applies to the first time you purchase a course. I do not offer
multiple refunds for the same course, so if you purchase a course, request a
refund, then purchase it again I will not offer a second refund. This is because
I am still charged the CC processing fee on a refund, and it isn't reasonable
for me to eat that cost multiple times.

I may also refuse a refund in extreme cases. For instance, if you buy the
course, download a large portion of the videos, then request a refund. I have
had issues with theft in the past, so I reserve the right to refuse a refund in
cases like this.

If you have any questions about this policy, please reach out before purchasing.
I am genuinely trying to help people and will try to work with anyone, but a few
bad actors have unfortunately made it hard to offer refunds without some
restrictions.


HOW LONG WILL I HAVE ACCESS TO THE COURSE?

The course doesn't expire. Once you purchase, you will always have access to the
videos.

If you are worried, the complete package includes a way to download all the
content so that you can back everything up on your own devices as well. You
know, just in case I get hit by a truck or something. 🚛 *beep* *beep*


WHAT FORMATS ARE THE VIDEOS IN?

The videos are hosted with Vimeo and are streamable through their embedded
player. If you purchase the complete package I also offer DRM-free, high quality
1920x1080 mp4s that you can download.


WHERE IS THE SECTION ON TDD?

The short answer? There isn't one.

We use TDD some in the projects, but it isn't taught as a standalone concept.
That said, everything taught in this course can be applied to TDD with relative
ease.


DO YOU OFFER STUDENT DISCOUNTS?

Yes, students of any kind (high school, college, bootcamp, whatever else) can
send me an email with any sort of proof you are a student and I'll send you a
link to purchase the course with the student discount.


DO YOU OFFER TEAM PACKAGES?

Yes, I offer team packages. These include everything in the complete package,
but you get a discount for buying multiple copies. Reach out for more info -
jon@calhoun.io.







ABOUT THE AUTHOR

Jon Calhoun is a full stack web developer who teaches about Go, web development,
testing, algorithms, and anything else he finds interesting. He spoke at the
GothamGo conference about focusing on simplicity when writing software and is a
panelist on the Go Time podcast.

Previously, Jon founded EasyPost, a shipping API that many fortune 500 companies
use to power their shipping infrastructure. Before that he worked at Google as a
software engineer. Before that he studied computer science at UCF.

You can find more of Jon's work, including other FREE courses and tutorials he
has created, below.

 * Gophercises (FREE course)
 * Algorithms with Go (FREE course)
 * Web Development with Go
 * Calhoun.io
 * Errors in Go
 * Let's Learn Algorithms



Test with Go was created by @joncalhoun. The awesome gophers you see above were
designed by @egonelbre and slightly tweaked by me (if you see a mistake, it was
probably me).
© Jon Calhoun 2018. All rights reserved.