It's still too many tests with no apparent reason for the parameters chosen. If @flacjacket  is ok with this, I won't object, but I would prefer to see something like

# uncoupled
ans = [...list of unique answers...]
fun = [f(1, 1) for f in JxKet, JyKet, JzKet]
for f in fun:
    got = qapply(Rotation(0, 0, pi)*f)
    assert got in ans
    ans.remove(got)
assert not ans
arg = Rotation(a, b, g)*fun[0]
assert qapply(arg, dummy=False) == ...
assert str(qapply(arg) == str(...).replace('_', '')

# coupled
ans = [...list of unique answers...]
rot = Rotation(0, 0, pi), Rotation(a, b, g)
fun = [f(1, 1) for f in JxKetCoupled, JyKetCoupled, JzKetCoupled]
```

You aren't testing whether rotation is computed correctly -- that's already done. You are just testing the application of the rotation. I could be missing something, however.