<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Keith Ramsey</title>
    <link>https://keith-ramsey.com</link>
    <description>I&apos;m a SQL Server DBA who reaches for PowerShell before SSMS. When you&apos;re managing a farm of instances and running the same task 30, 50, or 100 times, the GUI just doesn&apos;t cut it — so I automate.</description>
    <language>en-US</language>
    <atom:link href="https://keith-ramsey.com/feed.xml" rel="self" type="application/rss+xml"/>
    
  <item>
    <title><![CDATA[Announcing "Pester for Beginners" — the whole 25-part series, all at once]]></title>
    <link>https://keith-ramsey.com/blog/announcing-pester-for-beginners</link>
    <guid isPermaLink="true">https://keith-ramsey.com/blog/announcing-pester-for-beginners</guid>
    <description><![CDATA[A complete beginner-to-confident series on testing PowerShell with Pester 5 — written offline, finished first, and released as one full set.]]></description>
    <pubDate>Mon, 22 Jun 2026 00:00:00 GMT</pubDate>
    <category>PowerShell</category>
    <category>Testing</category>
    <category>DevOps</category>
    <category>Beginners</category>
  </item>
  <item>
    <title><![CDATA[Putting It Together: A TDD Workflow + Common Pitfalls (Capstone)]]></title>
    <link>https://keith-ramsey.com/blog/tdd-workflow-capstone</link>
    <guid isPermaLink="true">https://keith-ramsey.com/blog/tdd-workflow-capstone</guid>
    <description><![CDATA[You have all the pieces. Now turn them into a habit: the red-green-refactor TDD loop in PowerShell, a checklist drawn from all six sections, the beginner pitfalls to dodge, and where to go next.]]></description>
    <pubDate>Wed, 17 Jun 2026 00:00:00 GMT</pubDate>
    <category>PowerShell</category>
    <category>Pester</category>
    <category>Testing</category>
    <category>TDD</category>
    <category>Beginners</category>
    <category>Capstone</category>
  </item>
  <item>
    <title><![CDATA[Running Pester in CI/CD (GitHub Actions & Azure Pipelines)]]></title>
    <link>https://keith-ramsey.com/blog/pester-in-cicd</link>
    <guid isPermaLink="true">https://keith-ramsey.com/blog/pester-in-cicd</guid>
    <description><![CDATA[Tests that only run when you remember them protect nothing. Wire the Pester 5 configuration object into GitHub Actions and Azure Pipelines so your suite runs on every push, publishes results, and fails the build on red.]]></description>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <category>PowerShell</category>
    <category>Pester</category>
    <category>Testing</category>
    <category>CI/CD</category>
    <category>GitHubActions</category>
    <category>AzurePipelines</category>
    <category>Automation</category>
  </item>
  <item>
    <title><![CDATA[Configuring Pester with New-PesterConfiguration]]></title>
    <link>https://keith-ramsey.com/blog/new-pesterconfiguration</link>
    <guid isPermaLink="true">https://keith-ramsey.com/blog/new-pesterconfiguration</guid>
    <description><![CDATA[Passing flags to Invoke-Pester works until you have ten of them. Learn the Pester 5 configuration object: Run.Path, Output.Verbosity, Filter.Tag, CodeCoverage, and TestResult, all in one tidy, reusable, version-controllable object.]]></description>
    <pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate>
    <category>PowerShell</category>
    <category>Pester</category>
    <category>Testing</category>
    <category>Configuration</category>
    <category>Beginners</category>
    <category>Automation</category>
  </item>
  <item>
    <title><![CDATA[Measuring Code Coverage with Pester]]></title>
    <link>https://keith-ramsey.com/blog/code-coverage</link>
    <guid isPermaLink="true">https://keith-ramsey.com/blog/code-coverage</guid>
    <description><![CDATA[Code coverage tells you which lines your tests actually exercised. Learn to enable it with New-PesterConfiguration, read the missed-lines report, emit JaCoCo XML, and treat coverage as a guide rather than a goal.]]></description>
    <pubDate>Fri, 05 Jun 2026 00:00:00 GMT</pubDate>
    <category>PowerShell</category>
    <category>Pester</category>
    <category>Testing</category>
    <category>CodeCoverage</category>
    <category>Beginners</category>
    <category>Automation</category>
  </item>
  <item>
    <title><![CDATA[Welcome — and what to expect here]]></title>
    <link>https://keith-ramsey.com/blog/welcome</link>
    <guid isPermaLink="true">https://keith-ramsey.com/blog/welcome</guid>
    <description><![CDATA[Notes from a PowerShell-first DBA managing a farm of SQL Server instances.]]></description>
    <pubDate>Sun, 31 May 2026 00:00:00 GMT</pubDate>
    <category>personal</category>
    <category>meta</category>
  </item>
  <item>
    <title><![CDATA[I built a Kerberos SPN tool because setspn.exe made me feel stupid]]></title>
    <link>https://keith-ramsey.com/blog/sqlspnmanager-deep-dive</link>
    <guid isPermaLink="true">https://keith-ramsey.com/blog/sqlspnmanager-deep-dive</guid>
    <description><![CDATA[SqlSpnManager was the first module I published to PowerShell Gallery — and not the first one I built. Here's what it does, why it exists, and how the plan-before-execute design saves you from yourself.]]></description>
    <pubDate>Sun, 31 May 2026 00:00:00 GMT</pubDate>
    <category>powershell</category>
    <category>sql-server</category>
    <category>kerberos</category>
    <category>dba</category>
  </item>
  <item>
    <title><![CDATA[Save-Work: one command, four Git steps, and three ways I almost leaked your password]]></title>
    <link>https://keith-ramsey.com/blog/giteasy-save-work-deep-dive</link>
    <guid isPermaLink="true">https://keith-ramsey.com/blog/giteasy-save-work-deep-dive</guid>
    <description><![CDATA[A deep look at how GitEasy's core command works under the hood — including the credential security problems I found and fixed along the way.]]></description>
    <pubDate>Sun, 31 May 2026 00:00:00 GMT</pubDate>
    <category>powershell</category>
    <category>git</category>
    <category>opensource</category>
    <category>security</category>
  </item>
  <item>
    <title><![CDATA[Mocking Pitfalls: Scope, InModuleScope, and Over-Mocking]]></title>
    <link>https://keith-ramsey.com/blog/mocking-pitfalls-inmodulescope</link>
    <guid isPermaLink="true">https://keith-ramsey.com/blog/mocking-pitfalls-inmodulescope</guid>
    <description><![CDATA[Mocking is the feature beginners get most wrong. Learn why a Mock 'doesn't take' inside a module, fix it with InModuleScope, test private functions, and recognize over-mocking as a design smell.]]></description>
    <pubDate>Sat, 30 May 2026 00:00:00 GMT</pubDate>
    <category>powershell</category>
    <category>pester</category>
    <category>testing</category>
    <category>mocking</category>
    <category>inmodulescope</category>
  </item>
  <item>
    <title><![CDATA[Targeted Mocks with -ParameterFilter]]></title>
    <link>https://keith-ramsey.com/blog/parameterfilter</link>
    <guid isPermaLink="true">https://keith-ramsey.com/blog/parameterfilter</guid>
    <description><![CDATA[A blanket mock is blunt. Learn Pester 5's -ParameterFilter so one command behaves differently depending on its arguments, and verify the exact call you care about with Should -Invoke.]]></description>
    <pubDate>Tue, 26 May 2026 00:00:00 GMT</pubDate>
    <category>powershell</category>
    <category>pester</category>
    <category>testing</category>
    <category>mocking</category>
    <category>parameterfilter</category>
  </item>
  <item>
    <title><![CDATA[Proving Interactions with Should -Invoke]]></title>
    <link>https://keith-ramsey.com/blog/should-invoke</link>
    <guid isPermaLink="true">https://keith-ramsey.com/blog/should-invoke</guid>
    <description><![CDATA[Sometimes the behavior is the call itself. Use Pester 5's Should -Invoke to prove a command ran exactly once, or never ran at all, with the right -Times, -Exactly, and -Scope.]]></description>
    <pubDate>Thu, 21 May 2026 00:00:00 GMT</pubDate>
    <category>powershell</category>
    <category>pester</category>
    <category>testing</category>
    <category>mocking</category>
    <category>should-invoke</category>
  </item>
  <item>
    <title><![CDATA[Why I'm a PowerShell-first DBA]]></title>
    <link>https://keith-ramsey.com/blog/why-powershell-first</link>
    <guid isPermaLink="true">https://keith-ramsey.com/blog/why-powershell-first</guid>
    <description><![CDATA[SSMS is a great editor. It's a terrible loop. At thirty instances, the case for PowerShell stops being a preference and starts being math.]]></description>
    <pubDate>Wed, 20 May 2026 00:00:00 GMT</pubDate>
    <category>powershell</category>
    <category>sql-server</category>
    <category>philosophy</category>
  </item>
  <item>
    <title><![CDATA[Mock Basics: Replacing a Command's Behavior]]></title>
    <link>https://keith-ramsey.com/blog/mock-basics</link>
    <guid isPermaLink="true">https://keith-ramsey.com/blog/mock-basics</guid>
    <description><![CDATA[Learn the core Mock mechanic in Pester 5: swap a real command for one you control, return canned values, simulate failures, and where the Mock must live so it actually takes effect.]]></description>
    <pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate>
    <category>powershell</category>
    <category>pester</category>
    <category>testing</category>
    <category>mocking</category>
    <category>unit-testing</category>
  </item>
  <item>
    <title><![CDATA[What Mocking Is and When You Actually Need It]]></title>
    <link>https://keith-ramsey.com/blog/what-mocking-is</link>
    <guid isPermaLink="true">https://keith-ramsey.com/blog/what-mocking-is</guid>
    <description><![CDATA[Mocking lets you test your logic without triggering real-world consequences like sending email or deleting files. Learn the concept, the good candidates, and when to leave a command alone.]]></description>
    <pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate>
    <category>powershell</category>
    <category>pester</category>
    <category>testing</category>
    <category>mocking</category>
    <category>unit-testing</category>
  </item>
  <item>
    <title><![CDATA[Tagging and Filtering Which Tests Run]]></title>
    <link>https://keith-ramsey.com/blog/tagging-and-filtering</link>
    <guid isPermaLink="true">https://keith-ramsey.com/blog/tagging-and-filtering</guid>
    <description><![CDATA[When your suite takes minutes, run only the fast ones becomes a daily need. Learn to tag tests in Pester 5 and filter them with the configuration object using Filter.Tag and Filter.ExcludeTag.]]></description>
    <pubDate>Fri, 08 May 2026 00:00:00 GMT</pubDate>
    <category>powershell</category>
    <category>pester</category>
    <category>testing</category>
    <category>tags</category>
    <category>filtering</category>
    <category>configuration</category>
  </item>
  <item>
    <title><![CDATA[Data-Driven Tests with -ForEach and -TestCases]]></title>
    <link>https://keith-ramsey.com/blog/data-driven-tests-foreach-testcases</link>
    <guid isPermaLink="true">https://keith-ramsey.com/blog/data-driven-tests-foreach-testcases</guid>
    <description><![CDATA[Copy-pasting an It block five times with different numbers is a smell. Learn to write one parametrized test that runs over a table of cases using Pester 5's -ForEach and -TestCases.]]></description>
    <pubDate>Sun, 03 May 2026 00:00:00 GMT</pubDate>
    <category>powershell</category>
    <category>pester</category>
    <category>testing</category>
    <category>data-driven</category>
    <category>foreach</category>
    <category>testcases</category>
  </item>
  <item>
    <title><![CDATA[Safe File and Registry Tests with TestDrive and TestRegistry]]></title>
    <link>https://keith-ramsey.com/blog/testdrive-testregistry</link>
    <guid isPermaLink="true">https://keith-ramsey.com/blog/testdrive-testregistry</guid>
    <description><![CDATA[Code that writes files should not write them to your real disk during a test. Pester gives you a per-test sandbox with TestDrive and TestRegistry that cleans itself up automatically.]]></description>
    <pubDate>Fri, 01 May 2026 00:00:00 GMT</pubDate>
    <category>powershell</category>
    <category>pester</category>
    <category>testing</category>
    <category>testdrive</category>
    <category>testregistry</category>
    <category>filesystem</category>
  </item>
  <item>
    <title><![CDATA[Getting Your Function Under Test (Dot-Sourcing vs Modules)]]></title>
    <link>https://keith-ramsey.com/blog/function-under-test-dotsourcing-modules</link>
    <guid isPermaLink="true">https://keith-ramsey.com/blog/function-under-test-dotsourcing-modules</guid>
    <description><![CDATA[Toy tests use inline functions, but real testing means loading your own code. Learn the two clean ways to get a function under test in Pester 5: dot-sourcing a script and importing a module.]]></description>
    <pubDate>Fri, 24 Apr 2026 00:00:00 GMT</pubDate>
    <category>powershell</category>
    <category>pester</category>
    <category>testing</category>
    <category>dot-sourcing</category>
    <category>modules</category>
    <category>beforeall</category>
  </item>
  <item>
    <title><![CDATA[File Layout: .Tests.ps1, Folders, and Naming Conventions]]></title>
    <link>https://keith-ramsey.com/blog/file-layout-tests-conventions</link>
    <guid isPermaLink="true">https://keith-ramsey.com/blog/file-layout-tests-conventions</guid>
    <description><![CDATA[Organize a PowerShell project so Pester finds every test by convention: the .Tests.ps1 rule, one file per source file, Unit vs Integration folders, and robust paths with PSScriptRoot.]]></description>
    <pubDate>Mon, 20 Apr 2026 00:00:00 GMT</pubDate>
    <category>powershell</category>
    <category>pester</category>
    <category>testing</category>
    <category>project-layout</category>
    <category>conventions</category>
  </item>
  <item>
    <title><![CDATA[Arrange–Act–Assert and Naming Tests People Can Read]]></title>
    <link>https://keith-ramsey.com/blog/arrange-act-assert-naming</link>
    <guid isPermaLink="true">https://keith-ramsey.com/blog/arrange-act-assert-naming</guid>
    <description><![CDATA[A test you can read in five seconds is a test you'll trust at 2 a.m. Learn the Arrange-Act-Assert pattern and the should...when naming style that make Pester tests self-documenting.]]></description>
    <pubDate>Fri, 17 Apr 2026 00:00:00 GMT</pubDate>
    <category>pester</category>
    <category>powershell</category>
    <category>testing</category>
    <category>aaa</category>
    <category>naming</category>
    <category>structure</category>
  </item>
  <item>
    <title><![CDATA[Setup & Teardown: BeforeAll, AfterAll, BeforeEach, AfterEach]]></title>
    <link>https://keith-ramsey.com/blog/setup-teardown-beforeall-aftereach</link>
    <guid isPermaLink="true">https://keith-ramsey.com/blog/setup-teardown-beforeall-aftereach</guid>
    <description><![CDATA[Pester 5 runs your test file in two phases — Discovery and Run. Understand that model and the four setup/teardown blocks fall into place.]]></description>
    <pubDate>Sat, 11 Apr 2026 00:00:00 GMT</pubDate>
    <category>pester</category>
    <category>powershell</category>
    <category>testing</category>
    <category>beforeall</category>
    <category>discovery</category>
    <category>structure</category>
  </item>
  <item>
    <title><![CDATA[Describe vs Context vs It: Organizing Intent]]></title>
    <link>https://keith-ramsey.com/blog/describe-vs-context-vs-it</link>
    <guid isPermaLink="true">https://keith-ramsey.com/blog/describe-vs-context-vs-it</guid>
    <description><![CDATA[Three Pester keywords, one job each. Learn how Describe, Context, and It nest to make a growing test suite read like a specification.]]></description>
    <pubDate>Mon, 06 Apr 2026 00:00:00 GMT</pubDate>
    <category>pester</category>
    <category>powershell</category>
    <category>testing</category>
    <category>describe</category>
    <category>context</category>
    <category>structure</category>
  </item>
  <item>
    <title><![CDATA[Saying "Not": Negating Assertions Cleanly]]></title>
    <link>https://keith-ramsey.com/blog/negating-assertions-not</link>
    <guid isPermaLink="true">https://keith-ramsey.com/blog/negating-assertions-not</guid>
    <description><![CDATA[Use Pester's -Not switch correctly—where it goes, why negative assertions like 'not null' are weak claims, and how to prefer strong positive assertions instead.]]></description>
    <pubDate>Fri, 03 Apr 2026 00:00:00 GMT</pubDate>
    <category>powershell</category>
    <category>pester</category>
    <category>testing</category>
    <category>assertions</category>
    <category>negation</category>
  </item>
  <item>
    <title><![CDATA[Testing That Things Fail: Should -Throw]]></title>
    <link>https://keith-ramsey.com/blog/testing-that-things-fail-should-throw</link>
    <guid isPermaLink="true">https://keith-ramsey.com/blog/testing-that-things-fail-should-throw</guid>
    <description><![CDATA[Test the error paths in your PowerShell code with Should -Throw—wrap the act in a scriptblock, assert on the message and ErrorId, and use Should -Not -Throw for must-succeed cases.]]></description>
    <pubDate>Mon, 30 Mar 2026 00:00:00 GMT</pubDate>
    <category>powershell</category>
    <category>pester</category>
    <category>testing</category>
    <category>assertions</category>
    <category>errors</category>
  </item>
  <item>
    <title><![CDATA[Comparing Numbers, Strings, and Collections]]></title>
    <link>https://keith-ramsey.com/blog/comparing-numbers-strings-collections</link>
    <guid isPermaLink="true">https://keith-ramsey.com/blog/comparing-numbers-strings-collections</guid>
    <description><![CDATA[Go beyond equality with Pester's numeric, string, and collection operators—-BeGreaterThan, -Match, -Like, -Contain, -BeIn, and -HaveCount—and assert on object properties.]]></description>
    <pubDate>Mon, 23 Mar 2026 00:00:00 GMT</pubDate>
    <category>powershell</category>
    <category>pester</category>
    <category>testing</category>
    <category>assertions</category>
    <category>collections</category>
  </item>
  <item>
    <title><![CDATA[The Should Command and Core Operators]]></title>
    <link>https://keith-ramsey.com/blog/should-command-core-operators</link>
    <guid isPermaLink="true">https://keith-ramsey.com/blog/should-command-core-operators</guid>
    <description><![CDATA[Meet Pester's Should command and the five everyday operators—-Be, -BeExactly, -BeNullOrEmpty, -BeTrue/-BeFalse, and -BeOfType—that cover most real assertions.]]></description>
    <pubDate>Sat, 21 Mar 2026 00:00:00 GMT</pubDate>
    <category>powershell</category>
    <category>pester</category>
    <category>testing</category>
    <category>assertions</category>
    <category>should</category>
  </item>
  <item>
    <title><![CDATA[Running Tests with Invoke-Pester and Reading the Output]]></title>
    <link>https://keith-ramsey.com/blog/running-tests-invoke-pester-output</link>
    <guid isPermaLink="true">https://keith-ramsey.com/blog/running-tests-invoke-pester-output</guid>
    <description><![CDATA[Run Pester tests on a file or a whole folder, read the pass/fail summary, decode an Expected-vs-But-was failure, turn up the detail, and understand the exit code that CI lives by.]]></description>
    <pubDate>Mon, 16 Mar 2026 00:00:00 GMT</pubDate>
    <category>PowerShell</category>
    <category>Pester</category>
    <category>Invoke-Pester</category>
    <category>Output</category>
    <category>Beginners</category>
  </item>
  <item>
    <title><![CDATA[Your First Test: Describe, It, and Should]]></title>
    <link>https://keith-ramsey.com/blog/your-first-test-describe-it-should</link>
    <guid isPermaLink="true">https://keith-ramsey.com/blog/your-first-test-describe-it-should</guid>
    <description><![CDATA[Write the smallest useful Pester test using Describe, It, and Should, then test a tiny real function and watch it go from red to green.]]></description>
    <pubDate>Tue, 10 Mar 2026 00:00:00 GMT</pubDate>
    <category>PowerShell</category>
    <category>Pester</category>
    <category>Describe</category>
    <category>It</category>
    <category>Should</category>
    <category>Beginners</category>
  </item>
  <item>
    <title><![CDATA[Installing Pester (and Untangling v3/4 vs v5)]]></title>
    <link>https://keith-ramsey.com/blog/installing-pester-v3-v4-vs-v5</link>
    <guid isPermaLink="true">https://keith-ramsey.com/blog/installing-pester-v3-v4-vs-v5</guid>
    <description><![CDATA[Get to a clean Pester 5.x install: check your current version, understand why Windows ships the old 3.4, install from the PSGallery correctly, and verify it loaded.]]></description>
    <pubDate>Sat, 07 Mar 2026 00:00:00 GMT</pubDate>
    <category>PowerShell</category>
    <category>Pester</category>
    <category>Installation</category>
    <category>PSGallery</category>
    <category>Beginners</category>
  </item>
  <item>
    <title><![CDATA[What Is Pester, and Why Test PowerShell at All?]]></title>
    <link>https://keith-ramsey.com/blog/what-is-pester-and-why-test</link>
    <guid isPermaLink="true">https://keith-ramsey.com/blog/what-is-pester-and-why-test</guid>
    <description><![CDATA[A gentle, vendor-neutral introduction to automated testing for PowerShell scripters: what Pester is, unit vs integration in plain English, and what tests actually buy you.]]></description>
    <pubDate>Tue, 03 Mar 2026 00:00:00 GMT</pubDate>
    <category>PowerShell</category>
    <category>Pester</category>
    <category>Testing</category>
    <category>Beginners</category>
    <category>Automation</category>
  </item>
  </channel>
</rss>