Start here. This is the direct spoken answer to practice first.
Overview
A harness adds a supported testing API around a component, trading small upfront cost for lower coupling across many tests.
I use an existing harness, such as an Angular Material harness, when interacting with a complex widget through raw DOM details would be brittle. For a shared component library, I consider writing a harness when many consumers need the same user actions and observable states. For a small local component with one or two tests, direct accessible DOM queries are often simpler.