mudasobwa

mudasobwa

Creator of Cure

Thanks to Brian @bglusman who provided a very valuable PR to this library, I am to introduce the mutation-testing library for BEAM languages named Muex.

Why another one, when we already have Darwin and Exavier? Well, because I like to write code (more formal comparison can be found here.)

This library is also a part of the Language Agnostic Code Audit SaaS effort, MIT-license. Here is the repo:

https://github.com/Oeditus/muex


Example outcome:

❯ mix muex --files "examples/cart/lib/cart/*.ex" --verbose
Loading files from examples/cart/lib/cart/*.ex...
Found 2 file(s)
Analyzing files for mutation testing suitability...
  ✓ examples/cart/lib/cart/product.ex (score: 100)
  ✓ examples/cart/lib/cart/shopping_cart.ex (score: 100)
Selected 2 file(s), skipped 0 file(s)
Generating mutations...
Applying mutation optimization...
Original mutations: 1541
Optimized mutations: 31
Reduction: 1510 (-98.0%)
Average impact score: 6.9
Testing 31 mutation(s)
Analyzing test dependencies...
Running tests...

×××·×××××·×××
---×××·×××××××××××


Mutation Testing Results
==================================================
Total mutants: 31
Killed: 3 (caught by tests)
Survived: 25 (not caught by tests)
Invalid: 3 (compilation errors)
Timeout: 0
==================================================
Mutation Score: 9.68%


Survived Mutations:
--------------------------------------------------
examples/cart/lib/cart/product.ex:144
  Boolean: and to or

…

** (Mix) Mutation score 9.68% is below threshold 100%

Showing Posts 1 to 10

krisleech

krisleech

Thanks for open sourcing this, I’m playing with it now. It great to have this in Elixir.

mudasobwa

mudasobwa OP

Creator of Cure

v0.6.0 is out, all kudos go to @bglusman

Fixes:

  • classify sandbox compilation errors as :invalid, not :killed
  • auto-discover mutators + StatementDeletion & ReturnValue mutators

Features:

  • parallel cross-file mutation testing with sandbox isolation
lud

lud

Very interesting project! Thank you. I left an issue on Github because it seems to have problem compiling my project that uses macros.

mudasobwa

mudasobwa OP

Creator of Cure

Yeah, thanks! I am on it already.

lud

lud

I had Claude Code left you a comment too, which may or may not be useful :smiley:

mudasobwa

mudasobwa OP

Creator of Cure

Nah, the thing is I overestimated my ability to deal with a dozen of projects faster than my AI assistant (I am kinda competing with her on that matter :slight_smile:)

Yesterday I messed up merging new features and in a rush I did not validate it 102%. Stay tuned, the working version is to be there soon.

mudasobwa

mudasobwa OP

Creator of Cure

v0.6.1 is out, thanks @lud for testing and reporting the bug.

Fixes:

  • Less aggressive optimization without premature Code.compile_string/2
lud

lud

I’ll try as soon as possible :slight_smile:

lud

lud

Hello,

So I let it run with mix muex --optimize --optimize-level aggressive --verbose and it still takes a lot of time. I believe JSV was a very bad match because there are 7000 tests. I’ll try to move the tests so I can target only the right subset (for now I have a generated/ tests directory inside test/jsv/ so I cannot target "all files except those in generated. But it could be nice to be able to pass exclusion flags to mix testto exclude a@moduletag`.

Then about the results I’m not so sure how to interpret them.

Survived Mutations:
--------------------------------------------------
lib/jsv/vocabulary/v7/applicator.ex:86
  ReturnValue: replace return value of validate_keyword with nil

If I return nil from the function defined I have 52 test failures when running manually.

lib/jsv.ex:374
  StatementDeletion: delete statement 63 of 138

This is a @doc group @doc_group. I also have results about removing a @doc false statement. Those should be ignored.

lib/jsv/resolver.ex:276
  StatementDeletion: delete statement 36 of 78

I’m not sure what is statement 36:

   283	  defp scan_subschema(list, parent_id, nss, meta, path, acc) when is_list(list) do
   284	    list
   285	    |> Enum.with_index()
   286	    |> EnumExt.reduce_ok(acc, fn {item, index}, acc ->
   287	      scan_subschema(item, parent_id, nss, meta, [index | path], acc)
   288	    end)
   289	  end

Some results file:line point to a defstruct statement. The app does not compile if I remove them.

So in the end it’s not really helpful for now with all those delete statement X of Y because I don’t know what that is. It could be really helpful to have a report file with patches so we can see what was the mutation, reproduce it, write a test to invalidate.

I’m trying to see if the html report has this, but I can’t find a file to generate actual mutations. I set a “limit 30” but it only generates “invalid mutations”. I’ll try to re-run the full output (still with aggressive though) later.

But it was already helpful in some way, so far I know that I have to test a @derive {Inspect, ... statement that is not tested at all.

So I believe this is promising but you need a way to make prioritize the mutations in some way.

mudasobwa

mudasobwa OP

Creator of Cure

Yes. And this is unavoidable. We (@bglusman and myself) put a lot of effort to the sophisticated optimization, but Elixir is still a compiled language.

That’s exactly what’s planned next.

Absolutely! Thanks for helping to test it!

Where Next? Top

Trending in Announcing Top

restlessronin
The repo is at GitHub - cyberchitta/openai_ex: Community maintained Elixir library for OpenAI API · GitHub. Docs are at OpenaiEx User Gu...
152 12366 136
New
type1fool
WebAuthnLiveComponent WebAuthnComponents See this post about renaming the package. Passwordless authentication for Phoenix LiveView app...
New
GenericJam
Edit: 2026 May 15 - This post is archived. Mob is alive!! Main docs: mob v0.7.11 — Documentation A bit of explanation for the slightly c...
New
woylie
I released Doggo, a collection of unstyled Phoenix components. https://github.com/woylie/doggo Features Unstyled Phoenix components....
New
mudasobwa
I fully migrated to my own harness from Anthropic/Gemini and I think it’s time to share it. Welcome DSH, the DeepSeek Harness, fully writ...
New
ausimian
Castle is a package I put together to assist with building Elixir releases capable of being live-upgraded via the ‘official’ release hand...
New
mcass19
ExRatatui lets you cook up rich terminal UIs in Elixir, powered by Rust’s ratatui via Rustler NIFs. Build interactive terminal applicatio...
New

Other Trending Topics Top

budgie
A little off-topic, but I feel like people here have a good head on their shoulders. I used to be quite good at making software. Was luc...
New
KristerV
Hey. Is there anyone here who creates agents in their apps? Not talking about using agents, but creating them. I’m finding it pretty diff...
New
juhalehtonen
There has been a thread to discuss the Stack Overflow Developer Survey on this forum every year since 2018, so here’s yet another one for...
New
budgie
I love Elixir. It’s one of 2 programming languages I’ve ever fallen in love with. But I don’t use it anymore. Serverless was the promis...
New
Null-logic-0
What IDE or editor are you using for Elixir development? Personally, I use Zed, and I really like it, but sometimes I wish there were a ...
New
OndrejValenta
(I just needed to vent somewhere and LinkedIn is full of hope, or hype, I’m not sure which exactly) AI dream has many faces, but general...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews