kelvinst
Why is defmodule line marked as executable on mix test --cover?
When I run mix test --cover in my Phoenix project, I get some files with poor coverage because they are tiny modules with a use Something, and some of them mark the defmodule X do line as executable.
e.g.
Any idea why?
Marked As Solved
sodapopcan
This really piqued my curiosity so I put together a little test and it seems you’re… half right? I’m not exactly known for being able to come up with the most accurate scenarios for these things but it appears you just need to use something from the dependency module.
With this test:
defmodule CoverTest do
use ExUnit.Case
test "foobars the world" do
assert Cover.hello() == "foobar"
end
end
…and this dependency module:
defmodule Cover.Dep do
defmacro __using__(_) do
quote do
def foo, do: "foo"
def bar, do: "bar"
end
end
end
…this gets 50% coverage:
defmodule Cover do
use Cover.Dep
def hello do
"foobar"
end
end
…and this gets 100%:
defmodule Cover do
use Cover.Dep
def hello do
foo() <> bar()
end
end
…which I thought proved your theory right until I tried this:
defmodule Cover do
use Cover.Dep
def hello do
foo() <> "bar"
end
end
…which also scores 100% ![]()
So ya, I know your post is only 5 hours old but BUMP for anyone who knows! ![]()
EDIT: Oh, perhaps it’s because it doesn’t consider strings executable so the fact that you are using anything from the module means it’s covered?
Also Liked
christhekeele
kelvinst
It scores 100% because as foo and bar are defined by Cover.Dep, using any function defined from it would mark the defmodule line as covered. The defs inside quotes aren’t marked as executable by the coverage tool at all.
Anyway, thanks for the investigation! That’s definitely why I posted here, cause I knew there was going to be someone as curious as I am - but not as lazy as I was - that would test it ![]()
sodapopcan
Last Post!
christhekeele
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #hex










