# Using fprof with unit test - getting FunctionClauseError

**URL:** <https://forum.elixirforum.com/t/using-fprof-with-unit-test-getting-functionclauseerror/14146>\
**Category:** Questions\
**Tags:** testing, troubleshooting, fprof\
**Created:** [May 11, 2018, 8:11am UTC](https://forum.elixirforum.com/t/using-fprof-with-unit-test-getting-functionclauseerror/14146 "2018-05-11T08:11:24Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![baupaola](https://forum.elixirforum.com/letter_avatar_proxy/v4/letter/b/dfb087/32.png) [@baupaola](https://forum.elixirforum.com/u/baupaola)\
**Post date:** [May 11, 2018, 8:11am UTC](https://forum.elixirforum.com/t/using-fprof-with-unit-test-getting-functionclauseerror/14146/1 "2018-05-11T08:11:25Z")

</div>

Hi, I need profile a slow my function test in suite test.  
I used the suggestion of Bryan Stearns ([https://selfamusementpark.com/profiling-a-slow-elixir-test](https://selfamusementpark.com/profiling-a-slow-elixir-test))  
but it does not work if I have variable or function outside the scope.  
My hex version is

```elixir
System.version
"1.6.4"

```

I tried **iex -S mix profile.fprof --no-compile -e “Mix.Tasks.Test.run([])”**, it work but the out is for all my test.  
I need profile a single test , i tried **iex -S mix profile.fprof --no-compile -e “Mix.Tasks.Test.run([only: "test/test\_only\_profile\_trest.exs"])”**

but the output is:

```elixir
Erlang/OTP 20 [erts-9.3.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]

07:53:28.841 application=router module=Router function=start_link/1 [info] started ... with opts [name: RouterGenServer]
07:53:28.841 application=router module=Router function=init/1 [debug] init Elixir.Router with args -->[]
Warmup...
warning: variable "x" is unused
  test/support/helper.exs:37

warning: variable "tdiff" is unused
  test/support/helper.exs:46

** (FunctionClauseError) no function clause matching in String.split/3    
    
    The following arguments were given to **String.split/3:**
    
        # 1
        {:only, "test/test_only_profile_trest.exs"}
    
        # 2
        ":"
    
        # 3
        []
    
    Attempted function clauses (showing 4 out of 4):
    
        def split(string, %Regex{} = pattern, options) when is_binary(string)
        def split(string, "", options) when is_binary(string)
        def split(string, pattern, []) when is_tuple(pattern) or is_binary(string)
        def split(string, pattern, options) when is_binary(string)
    
    (elixir) lib/string.ex:383: String.split/3
    (ex_unit) lib/ex_unit/filters.ex:17: ExUnit.Filters.parse_path/1
    (mix) lib/mix/tasks/test.ex:338: Mix.Tasks.Test.parse_files/2
    (mix) lib/mix/tasks/test.ex:260: Mix.Tasks.Test.run/1
    (mix) lib/mix/tasks/profile.fprof.ex:167: Mix.Tasks.Profile.Fprof.profile_and_analyse/2
    (mix) lib/mix/tasks/profile.fprof.ex:160: Mix.Tasks.Profile.Fprof.profile/2

```

My mistake where is?  
The key “only” is true for task test.

Thanks in advance.  
Paola.

---

<div class="post-metadata">

**Author:** ![NobbZ](https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/nobbz/32/27235_2.png) [@NobbZ](https://forum.elixirforum.com/u/NobbZ)\
**Post date:** [May 11, 2018, 8:18am UTC](https://forum.elixirforum.com/t/using-fprof-with-unit-test-getting-functionclauseerror/14146/2 "2018-05-11T08:18:33Z")

</div>

You need to specify the list of arguments as if you were giving it at the command line:

`Mix.Tasks.Test.run(["--only", "test/test_only_profile_trest.exs"])`

Aside of that, `--only` filters based on `@tag`s, you probably want to pass only the file to run tests from:

`Mix.Tasks.Test.run(["test/test_only_profile_trest.exs"])`

Finally, I do think you have a typo in the filename 😉

---

<div class="post-metadata">

**Author:** ![baupaola](https://forum.elixirforum.com/letter_avatar_proxy/v4/letter/b/dfb087/32.png) [@baupaola](https://forum.elixirforum.com/u/baupaola)\
**Post date:** [May 11, 2018, 8:47am UTC](https://forum.elixirforum.com/t/using-fprof-with-unit-test-getting-functionclauseerror/14146/3 "2018-05-11T08:47:10Z")

</div>

Thanks Nobbz,  
but not work

- test 1:

**iex -S mix profile.fprof --no-compile -e “Mix.Tasks.Test.run([“test/router\_only\_profile\_test.exs”])”**

```elixir
Erlang/OTP 20 [erts-9.3.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]

08:43:52.041 application=router module=Router function=start_link/1 [info] started ... with opts [name: RouterGenServer]
08:43:52.041 application=router module=Router function=init/1 [debug] init Elixir.Router with args -->[]
warning: variable "test" does not exist and is being expanded to "test()", please use parentheses to remove the ambiguity or change the variable name
  nofile:1

** (CompileError) nofile:1: undefined function test/0
    (stdlib) lists.erl:1354: :lists.mapfoldl/3

```

test 2:

**iex -S mix profile.fprof --no-compile -e “Mix.Tasks.Test.run([“only”, “test/router\_only\_profile\_test.exs”])”**

```elixir
Erlang/OTP 20 [erts-9.3.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]

08:44:12.995 application=router module=Router function=start_link/1 [info] started ... with opts [name: RouterGenServer]
08:44:12.995 application=router module=Router function=init/1 [debug] init Elixir.Router with args -->[]
warning: variable "only" does not exist and is being expanded to "only()", please use parentheses to remove the ambiguity or change the variable name
  nofile:1

** (CompileError) nofile:1: undefined function only/0
    (elixir) src/elixir_fn.erl:21: anonymous fn/3 in :elixir_fn.expand/3

```

I removed my typing error 🤭.  
Paola.

---

<div class="post-metadata">

**Author:** ![NobbZ](https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/nobbz/32/27235_2.png) [@NobbZ](https://forum.elixirforum.com/u/NobbZ)\
**Post date:** [May 11, 2018, 9:00am UTC](https://forum.elixirforum.com/t/using-fprof-with-unit-test-getting-functionclauseerror/14146/4 "2018-05-11T09:00:43Z")

</div>

I’m not sure how exactly you write the command into the terminal.

Therefore please try these exact commands (copy and paste) and then show us the **full** transcript when they fail and properly wrap everything into a codeblock, not only the output, but also the command.

```plaintext
iex -S mix profile.fprof --no-compile -e 'Mix.Tasks.Test.run(["test/router_only_profile_test.exs"])'
iex -S mix profile.fprof --no-compile -e 'Mix.Tasks.Test.run(["--only", "test/router_only_profile_test.exs"])'

```

---

<div class="post-metadata">

**Author:** ![baupaola](https://forum.elixirforum.com/letter_avatar_proxy/v4/letter/b/dfb087/32.png) [@baupaola](https://forum.elixirforum.com/u/baupaola)\
**Post date:** [May 11, 2018, 3:31pm UTC](https://forum.elixirforum.com/t/using-fprof-with-unit-test-getting-functionclauseerror/14146/5 "2018-05-11T15:31:17Z")

</div>

Thank you very much for your help, the error was double quotes after -e.  
Now work.  
Thank.  
Paola.
