Mini-book: Automated Testing & TDD with NUnit: An On-Ramp #706

Description

@SeanKilleen

Announcing this ambitious mini-project here so that we've got an issue to log things against.

Challenge / Opportunity

  • We've been talking about a lack of beginner docs and the desire for more cohesive samples
  • There's a lack of good, free "one-stop shop" places for people to learn automated testing principles and put them into practice at the same time.
  • We have the opportunity to help a lot of people out and (gently) correct some incorrect notions that some may have about automated testing, TDD, and the part that NUnit plays in those things.

The Intention

  • I intend to create a section of articles to serve as a mini-book, "the on-ramp guide", or "Automated Testing & TDD with NUnit: An On-Ramp"
  • I intend for this series to introduce the what and why of automated testing and TDD and along the way introduce the user to NUnit by way of implementing these concepts.
  • I intend to keep an outline so that others can jump in as they see fit and so that anyone can pick up. I'm not sure the best way to do this yet, but we'll figure it out. I'd like to avoid this taking the format of "unfinished" docs pages. For now, I'll publish the outline here and add to it over time; feel free to make suggestions in this issue and I'll update based on what I read.
  • I intend to take feedback from the larger community on what I produce, but I also intend to wait until after I produce it, because that's going to help the content come out a lot faster.
  • Where there are differences of opinion, I plan to showcase them and use them to build upon any of my opinions that are expressed.
  • I'm a strong believer in "different project; same team". If this takes off in the community and folks ask for an xUnit version, I may ask to move the docs somewhere and enhance them to allow for xUnit / MSTests as well.

The Living Outline

  • About This Series
  • The "Why" of Tests / TDD / NUnit
  • Types of Automated Tests
    • Unit
    • Integration
    • Acceptance/Functional
    • UI-based
  • Testing Trade-offs
    • The testing pyramid / funnel analogy
    • Considerations to make
  • Where do I start?
    • Greenfield Applications
    • Legacy Applications
    • Other Considerations
  • Getting Started with NUnit & TDD
    • Creating a test project
    • Writing your first tests
    • Time to refactor -- wait, what?
  • Good testing "rules of thumb"
    • Naming conventions
    • Aim for one logical assertion
    • FIRST rule
  • Extracting Common functionality
  • Dealing with State in Tests
  • Test Cases & Data
  • Common testing problems and tactical approaches to solve them
  • Individual style guides -- ways we work with these things

Metadata

Metadata

Assignees

No one assigned

    Labels

    Epichelp-wantedA place where we could use a helping hand.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
       blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
      }
      } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
      })();
      (function(){
      try {
      var __m = "github.com";
      var __re = new RegExp('^' + "github\\.com" + '
      
      Skip to content

      Mini-book: Automated Testing & TDD with NUnit: An On-Ramp #706

      Description

      @SeanKilleen

      Announcing this ambitious mini-project here so that we've got an issue to log things against.

      Challenge / Opportunity

      • We've been talking about a lack of beginner docs and the desire for more cohesive samples
      • There's a lack of good, free "one-stop shop" places for people to learn automated testing principles and put them into practice at the same time.
      • We have the opportunity to help a lot of people out and (gently) correct some incorrect notions that some may have about automated testing, TDD, and the part that NUnit plays in those things.

      The Intention

      • I intend to create a section of articles to serve as a mini-book, "the on-ramp guide", or "Automated Testing & TDD with NUnit: An On-Ramp"
      • I intend for this series to introduce the what and why of automated testing and TDD and along the way introduce the user to NUnit by way of implementing these concepts.
      • I intend to keep an outline so that others can jump in as they see fit and so that anyone can pick up. I'm not sure the best way to do this yet, but we'll figure it out. I'd like to avoid this taking the format of "unfinished" docs pages. For now, I'll publish the outline here and add to it over time; feel free to make suggestions in this issue and I'll update based on what I read.
      • I intend to take feedback from the larger community on what I produce, but I also intend to wait until after I produce it, because that's going to help the content come out a lot faster.
      • Where there are differences of opinion, I plan to showcase them and use them to build upon any of my opinions that are expressed.
      • I'm a strong believer in "different project; same team". If this takes off in the community and folks ask for an xUnit version, I may ask to move the docs somewhere and enhance them to allow for xUnit / MSTests as well.

      The Living Outline

      • About This Series
      • The "Why" of Tests / TDD / NUnit
      • Types of Automated Tests
        • Unit
        • Integration
        • Acceptance/Functional
        • UI-based
      • Testing Trade-offs
        • The testing pyramid / funnel analogy
        • Considerations to make
      • Where do I start?
        • Greenfield Applications
        • Legacy Applications
        • Other Considerations
      • Getting Started with NUnit & TDD
        • Creating a test project
        • Writing your first tests
        • Time to refactor -- wait, what?
      • Good testing "rules of thumb"
        • Naming conventions
        • Aim for one logical assertion
        • FIRST rule
      • Extracting Common functionality
      • Dealing with State in Tests
      • Test Cases & Data
      • Common testing problems and tactical approaches to solve them
      • Individual style guides -- ways we work with these things

      Metadata

      Metadata

      Assignees

      No one assigned

        Labels

        Epichelp-wantedA place where we could use a helping hand.

        Type

        No type

        Projects

        No projects

          Milestone

          No milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
          Skip to content

          Mini-book: Automated Testing & TDD with NUnit: An On-Ramp #706

          Description

          @SeanKilleen

          Announcing this ambitious mini-project here so that we've got an issue to log things against.

          Challenge / Opportunity

          • We've been talking about a lack of beginner docs and the desire for more cohesive samples
          • There's a lack of good, free "one-stop shop" places for people to learn automated testing principles and put them into practice at the same time.
          • We have the opportunity to help a lot of people out and (gently) correct some incorrect notions that some may have about automated testing, TDD, and the part that NUnit plays in those things.

          The Intention

          • I intend to create a section of articles to serve as a mini-book, "the on-ramp guide", or "Automated Testing & TDD with NUnit: An On-Ramp"
          • I intend for this series to introduce the what and why of automated testing and TDD and along the way introduce the user to NUnit by way of implementing these concepts.
          • I intend to keep an outline so that others can jump in as they see fit and so that anyone can pick up. I'm not sure the best way to do this yet, but we'll figure it out. I'd like to avoid this taking the format of "unfinished" docs pages. For now, I'll publish the outline here and add to it over time; feel free to make suggestions in this issue and I'll update based on what I read.
          • I intend to take feedback from the larger community on what I produce, but I also intend to wait until after I produce it, because that's going to help the content come out a lot faster.
          • Where there are differences of opinion, I plan to showcase them and use them to build upon any of my opinions that are expressed.
          • I'm a strong believer in "different project; same team". If this takes off in the community and folks ask for an xUnit version, I may ask to move the docs somewhere and enhance them to allow for xUnit / MSTests as well.

          The Living Outline

          • About This Series
          • The "Why" of Tests / TDD / NUnit
          • Types of Automated Tests
            • Unit
            • Integration
            • Acceptance/Functional
            • UI-based
          • Testing Trade-offs
            • The testing pyramid / funnel analogy
            • Considerations to make
          • Where do I start?
            • Greenfield Applications
            • Legacy Applications
            • Other Considerations
          • Getting Started with NUnit & TDD
            • Creating a test project
            • Writing your first tests
            • Time to refactor -- wait, what?
          • Good testing "rules of thumb"
            • Naming conventions
            • Aim for one logical assertion
            • FIRST rule
          • Extracting Common functionality
          • Dealing with State in Tests
          • Test Cases & Data
          • Common testing problems and tactical approaches to solve them
          • Individual style guides -- ways we work with these things

          Metadata

          Metadata

          Assignees

          No one assigned

            Labels

            Epichelp-wantedA place where we could use a helping hand.

            Type

            No type

            Projects

            No projects

              Milestone

              No milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
              Skip to content

              Mini-book: Automated Testing & TDD with NUnit: An On-Ramp #706

              Description

              @SeanKilleen

              Announcing this ambitious mini-project here so that we've got an issue to log things against.

              Challenge / Opportunity

              • We've been talking about a lack of beginner docs and the desire for more cohesive samples
              • There's a lack of good, free "one-stop shop" places for people to learn automated testing principles and put them into practice at the same time.
              • We have the opportunity to help a lot of people out and (gently) correct some incorrect notions that some may have about automated testing, TDD, and the part that NUnit plays in those things.

              The Intention

              • I intend to create a section of articles to serve as a mini-book, "the on-ramp guide", or "Automated Testing & TDD with NUnit: An On-Ramp"
              • I intend for this series to introduce the what and why of automated testing and TDD and along the way introduce the user to NUnit by way of implementing these concepts.
              • I intend to keep an outline so that others can jump in as they see fit and so that anyone can pick up. I'm not sure the best way to do this yet, but we'll figure it out. I'd like to avoid this taking the format of "unfinished" docs pages. For now, I'll publish the outline here and add to it over time; feel free to make suggestions in this issue and I'll update based on what I read.
              • I intend to take feedback from the larger community on what I produce, but I also intend to wait until after I produce it, because that's going to help the content come out a lot faster.
              • Where there are differences of opinion, I plan to showcase them and use them to build upon any of my opinions that are expressed.
              • I'm a strong believer in "different project; same team". If this takes off in the community and folks ask for an xUnit version, I may ask to move the docs somewhere and enhance them to allow for xUnit / MSTests as well.

              The Living Outline

              • About This Series
              • The "Why" of Tests / TDD / NUnit
              • Types of Automated Tests
                • Unit
                • Integration
                • Acceptance/Functional
                • UI-based
              • Testing Trade-offs
                • The testing pyramid / funnel analogy
                • Considerations to make
              • Where do I start?
                • Greenfield Applications
                • Legacy Applications
                • Other Considerations
              • Getting Started with NUnit & TDD
                • Creating a test project
                • Writing your first tests
                • Time to refactor -- wait, what?
              • Good testing "rules of thumb"
                • Naming conventions
                • Aim for one logical assertion
                • FIRST rule
              • Extracting Common functionality
              • Dealing with State in Tests
              • Test Cases & Data
              • Common testing problems and tactical approaches to solve them
              • Individual style guides -- ways we work with these things

              Metadata

              Metadata

              Assignees

              No one assigned

                Labels

                Epichelp-wantedA place where we could use a helping hand.

                Type

                No type

                Projects

                No projects

                  Milestone

                  No milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions

                  , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
                  Skip to content

                  Mini-book: Automated Testing & TDD with NUnit: An On-Ramp #706

                  Description

                  @SeanKilleen

                  Announcing this ambitious mini-project here so that we've got an issue to log things against.

                  Challenge / Opportunity

                  • We've been talking about a lack of beginner docs and the desire for more cohesive samples
                  • There's a lack of good, free "one-stop shop" places for people to learn automated testing principles and put them into practice at the same time.
                  • We have the opportunity to help a lot of people out and (gently) correct some incorrect notions that some may have about automated testing, TDD, and the part that NUnit plays in those things.

                  The Intention

                  • I intend to create a section of articles to serve as a mini-book, "the on-ramp guide", or "Automated Testing & TDD with NUnit: An On-Ramp"
                  • I intend for this series to introduce the what and why of automated testing and TDD and along the way introduce the user to NUnit by way of implementing these concepts.
                  • I intend to keep an outline so that others can jump in as they see fit and so that anyone can pick up. I'm not sure the best way to do this yet, but we'll figure it out. I'd like to avoid this taking the format of "unfinished" docs pages. For now, I'll publish the outline here and add to it over time; feel free to make suggestions in this issue and I'll update based on what I read.
                  • I intend to take feedback from the larger community on what I produce, but I also intend to wait until after I produce it, because that's going to help the content come out a lot faster.
                  • Where there are differences of opinion, I plan to showcase them and use them to build upon any of my opinions that are expressed.
                  • I'm a strong believer in "different project; same team". If this takes off in the community and folks ask for an xUnit version, I may ask to move the docs somewhere and enhance them to allow for xUnit / MSTests as well.

                  The Living Outline

                  • About This Series
                  • The "Why" of Tests / TDD / NUnit
                  • Types of Automated Tests
                    • Unit
                    • Integration
                    • Acceptance/Functional
                    • UI-based
                  • Testing Trade-offs
                    • The testing pyramid / funnel analogy
                    • Considerations to make
                  • Where do I start?
                    • Greenfield Applications
                    • Legacy Applications
                    • Other Considerations
                  • Getting Started with NUnit & TDD
                    • Creating a test project
                    • Writing your first tests
                    • Time to refactor -- wait, what?
                  • Good testing "rules of thumb"
                    • Naming conventions
                    • Aim for one logical assertion
                    • FIRST rule
                  • Extracting Common functionality
                  • Dealing with State in Tests
                  • Test Cases & Data
                  • Common testing problems and tactical approaches to solve them
                  • Individual style guides -- ways we work with these things

                  Metadata

                  Metadata

                  Assignees

                  No one assigned

                    Labels

                    Epichelp-wantedA place where we could use a helping hand.

                    Type

                    No type

                    Projects

                    No projects

                      Milestone

                      No milestone

                      Relationships

                      None yet

                      Development

                      No branches or pull requests

                      Issue actions

                      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
                      Skip to content

                      Mini-book: Automated Testing & TDD with NUnit: An On-Ramp #706

                      Description

                      @SeanKilleen

                      Announcing this ambitious mini-project here so that we've got an issue to log things against.

                      Challenge / Opportunity

                      • We've been talking about a lack of beginner docs and the desire for more cohesive samples
                      • There's a lack of good, free "one-stop shop" places for people to learn automated testing principles and put them into practice at the same time.
                      • We have the opportunity to help a lot of people out and (gently) correct some incorrect notions that some may have about automated testing, TDD, and the part that NUnit plays in those things.

                      The Intention

                      • I intend to create a section of articles to serve as a mini-book, "the on-ramp guide", or "Automated Testing & TDD with NUnit: An On-Ramp"
                      • I intend for this series to introduce the what and why of automated testing and TDD and along the way introduce the user to NUnit by way of implementing these concepts.
                      • I intend to keep an outline so that others can jump in as they see fit and so that anyone can pick up. I'm not sure the best way to do this yet, but we'll figure it out. I'd like to avoid this taking the format of "unfinished" docs pages. For now, I'll publish the outline here and add to it over time; feel free to make suggestions in this issue and I'll update based on what I read.
                      • I intend to take feedback from the larger community on what I produce, but I also intend to wait until after I produce it, because that's going to help the content come out a lot faster.
                      • Where there are differences of opinion, I plan to showcase them and use them to build upon any of my opinions that are expressed.
                      • I'm a strong believer in "different project; same team". If this takes off in the community and folks ask for an xUnit version, I may ask to move the docs somewhere and enhance them to allow for xUnit / MSTests as well.

                      The Living Outline

                      • About This Series
                      • The "Why" of Tests / TDD / NUnit
                      • Types of Automated Tests
                        • Unit
                        • Integration
                        • Acceptance/Functional
                        • UI-based
                      • Testing Trade-offs
                        • The testing pyramid / funnel analogy
                        • Considerations to make
                      • Where do I start?
                        • Greenfield Applications
                        • Legacy Applications
                        • Other Considerations
                      • Getting Started with NUnit & TDD
                        • Creating a test project
                        • Writing your first tests
                        • Time to refactor -- wait, what?
                      • Good testing "rules of thumb"
                        • Naming conventions
                        • Aim for one logical assertion
                        • FIRST rule
                      • Extracting Common functionality
                      • Dealing with State in Tests
                      • Test Cases & Data
                      • Common testing problems and tactical approaches to solve them
                      • Individual style guides -- ways we work with these things

                      Metadata

                      Metadata

                      Assignees

                      No one assigned

                        Labels

                        Epichelp-wantedA place where we could use a helping hand.

                        Type

                        No type

                        Projects

                        No projects

                          Milestone

                          No milestone

                          Relationships

                          None yet

                          Development

                          No branches or pull requests

                          Issue actions

                          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
                          Skip to content

                          Mini-book: Automated Testing & TDD with NUnit: An On-Ramp #706

                          Description

                          @SeanKilleen

                          Announcing this ambitious mini-project here so that we've got an issue to log things against.

                          Challenge / Opportunity

                          • We've been talking about a lack of beginner docs and the desire for more cohesive samples
                          • There's a lack of good, free "one-stop shop" places for people to learn automated testing principles and put them into practice at the same time.
                          • We have the opportunity to help a lot of people out and (gently) correct some incorrect notions that some may have about automated testing, TDD, and the part that NUnit plays in those things.

                          The Intention

                          • I intend to create a section of articles to serve as a mini-book, "the on-ramp guide", or "Automated Testing & TDD with NUnit: An On-Ramp"
                          • I intend for this series to introduce the what and why of automated testing and TDD and along the way introduce the user to NUnit by way of implementing these concepts.
                          • I intend to keep an outline so that others can jump in as they see fit and so that anyone can pick up. I'm not sure the best way to do this yet, but we'll figure it out. I'd like to avoid this taking the format of "unfinished" docs pages. For now, I'll publish the outline here and add to it over time; feel free to make suggestions in this issue and I'll update based on what I read.
                          • I intend to take feedback from the larger community on what I produce, but I also intend to wait until after I produce it, because that's going to help the content come out a lot faster.
                          • Where there are differences of opinion, I plan to showcase them and use them to build upon any of my opinions that are expressed.
                          • I'm a strong believer in "different project; same team". If this takes off in the community and folks ask for an xUnit version, I may ask to move the docs somewhere and enhance them to allow for xUnit / MSTests as well.

                          The Living Outline

                          • About This Series
                          • The "Why" of Tests / TDD / NUnit
                          • Types of Automated Tests
                            • Unit
                            • Integration
                            • Acceptance/Functional
                            • UI-based
                          • Testing Trade-offs
                            • The testing pyramid / funnel analogy
                            • Considerations to make
                          • Where do I start?
                            • Greenfield Applications
                            • Legacy Applications
                            • Other Considerations
                          • Getting Started with NUnit & TDD
                            • Creating a test project
                            • Writing your first tests
                            • Time to refactor -- wait, what?
                          • Good testing "rules of thumb"
                            • Naming conventions
                            • Aim for one logical assertion
                            • FIRST rule
                          • Extracting Common functionality
                          • Dealing with State in Tests
                          • Test Cases & Data
                          • Common testing problems and tactical approaches to solve them
                          • Individual style guides -- ways we work with these things

                          Metadata

                          Metadata

                          Assignees

                          No one assigned

                            Labels

                            Epichelp-wantedA place where we could use a helping hand.

                            Type

                            No type

                            Projects

                            No projects

                              Milestone

                              No milestone

                              Relationships

                              None yet

                              Development

                              No branches or pull requests

                              Issue actions

                              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
                              Skip to content

                              Mini-book: Automated Testing & TDD with NUnit: An On-Ramp #706

                              Description

                              @SeanKilleen

                              Announcing this ambitious mini-project here so that we've got an issue to log things against.

                              Challenge / Opportunity

                              • We've been talking about a lack of beginner docs and the desire for more cohesive samples
                              • There's a lack of good, free "one-stop shop" places for people to learn automated testing principles and put them into practice at the same time.
                              • We have the opportunity to help a lot of people out and (gently) correct some incorrect notions that some may have about automated testing, TDD, and the part that NUnit plays in those things.

                              The Intention

                              • I intend to create a section of articles to serve as a mini-book, "the on-ramp guide", or "Automated Testing & TDD with NUnit: An On-Ramp"
                              • I intend for this series to introduce the what and why of automated testing and TDD and along the way introduce the user to NUnit by way of implementing these concepts.
                              • I intend to keep an outline so that others can jump in as they see fit and so that anyone can pick up. I'm not sure the best way to do this yet, but we'll figure it out. I'd like to avoid this taking the format of "unfinished" docs pages. For now, I'll publish the outline here and add to it over time; feel free to make suggestions in this issue and I'll update based on what I read.
                              • I intend to take feedback from the larger community on what I produce, but I also intend to wait until after I produce it, because that's going to help the content come out a lot faster.
                              • Where there are differences of opinion, I plan to showcase them and use them to build upon any of my opinions that are expressed.
                              • I'm a strong believer in "different project; same team". If this takes off in the community and folks ask for an xUnit version, I may ask to move the docs somewhere and enhance them to allow for xUnit / MSTests as well.

                              The Living Outline

                              • About This Series
                              • The "Why" of Tests / TDD / NUnit
                              • Types of Automated Tests
                                • Unit
                                • Integration
                                • Acceptance/Functional
                                • UI-based
                              • Testing Trade-offs
                                • The testing pyramid / funnel analogy
                                • Considerations to make
                              • Where do I start?
                                • Greenfield Applications
                                • Legacy Applications
                                • Other Considerations
                              • Getting Started with NUnit & TDD
                                • Creating a test project
                                • Writing your first tests
                                • Time to refactor -- wait, what?
                              • Good testing "rules of thumb"
                                • Naming conventions
                                • Aim for one logical assertion
                                • FIRST rule
                              • Extracting Common functionality
                              • Dealing with State in Tests
                              • Test Cases & Data
                              • Common testing problems and tactical approaches to solve them
                              • Individual style guides -- ways we work with these things

                              Metadata

                              Metadata

                              Assignees

                              No one assigned

                                Labels

                                Epichelp-wantedA place where we could use a helping hand.

                                Type

                                No type

                                Projects

                                No projects

                                  Milestone

                                  No milestone

                                  Relationships

                                  None yet

                                  Development

                                  No branches or pull requests

                                  Issue actions