boxed / mutmut

Mutation testing system
https://mutmut.readthedocs.io
BSD 3-Clause "New" or "Revised" License
897 stars 109 forks source link

Add mutation for ternary operators #196

Open ryanfreckleton opened 3 years ago

ryanfreckleton commented 3 years ago

Ternary operator errors of not covering both branches can't be detected by coverage, so it would be useful to mutate these to enable/disable each branch. E.g.

mark = "x" if count % 2 else "o"

mutation into:

mark = "x" if count % 2 and False else "o"

and

mark = "x" if count % 2 or True else "o"

This types of mutations aren't as useful for normal if statements, because branch coverage can detect when one of the alternatives isn't covered.

boxed commented 3 years ago

Seems reasonable. Would you like to give it a shot to implement this?

ryanfreckleton commented 3 years ago

Sure! Apologies for the late response.

I’ll post right before I start implementing, in case anyone else wants to take it on.

brodycj commented 7 months ago

I would love to see this get done. My workaround is to keep a special git stash of changes to replace all ternaries with expanded if/else blocks. And mutation testing with this stash of changes did give me a surviving mutant in some private code I was working on. (I actually use my own fork with some extra hackage to raise a RuntimeError in case it finds any ternaries in the code to mutate.)

When I tried hacking in the existing code, it looks like the code in __init__.py can handle multiple mutations of single tokens such as operators, but not for anything bigger at this time. I am sure it should be pretty straightforward to update the code to support multiple mutations of larger pieces of code, unfortunately I have not yet succeeded with this.