rustkas

rustkas

Property-Based Testing with PropEr, Erlang, and Elixir: the location of the function under test (page 411)

In the 5th Question of the third chapter, it was proposed to create a function, as well as a testing property to test its work. In your answer on page 411, author suggested to write in a function in a properties file. Interesting. Why did you decide to write the function under test here? May be the module solutions in the source code folder src would be better place for it? It is very interesting to know the course of your thoughts on this issue.

Source code of the module in the src folder would be like this:

-module(solutions).

-export([word_count/1]).

word_count(String) ->
% ...

Property based test source code in the test folder would be like this:

-module(prop_solutions).

-include_lib("proper/include/proper.hrl").

%%%%%%%%%%%%%%%%%%
%%% Properties %%%
%%%%%%%%%%%%%%%%%%
prop_word_count() ->
    ?FORALL(String, (non_empty(string())),
            (word_count(String) =:= alt_word_count(String))).
% ...

I also noticed that Fred placed the call to the function under test on the left in the comparison expression. Why? He already explained this to me earlier.

Full project.

Marked As Solved

ferd

ferd

Author of Property-Based Testing with PropEr, LYSE, & Erlang in Anger

In normal production code you’d expect to ship it would be correct to put all implementation code on src/ and keep tests in test/.

However, since this is a book, I put them the way they are so that I could have one test file and one solutions file, and keep them separate from the project code for chapters when I was working on them. It reduces some amount of scattering and made it easier for me to just focus on the exercises, while also simplifying the annotations internal to source files when selecting subsets that get to be included in the book.

A reader downloading the code archive would also be able to look at the project without getting its code interspersed with exercises, which they legitimately my want to skip over, which is something I wanted to avoid as a potential confusion here.

One of the things not seen by the reader (by design), for example, is that I wanted all code to be testable for the book, including failing cases. So there are chapters there are 3 or 4 copies of a module existing. In chapter 3 it’s possible I had src/thinking.erl (final version), src/thinking.erl.a (first iteration shown), src/thinking.erl.b (second iteration), and so on.

This is something I could do so that if PropEr got upgrades while writing the book, I could go back in and re-generate the snippets for result sets in a way that wouldn’t require me to re-write everything every single time, while still leaving an artifact on disk that the PragProg editing system can bring into the page.

What I’m saying here is that the choice of where to put the code in this case is one of code organization related to the book and its authoring process, and specifically here, keeping exercises and solutions separate from the chapter’s project both for my sake, but also for the sake of readers who might want to look ahead in the code bundle that ships with the book without caring for the exercises.

The code has a distinct purpose from shipping software, and its organization may reflect that.


A note on the last comment there: there is far less thought going into which order to put functions in the assertions than you are implying here. My other response mentions a possible approach I could suggest in general, but at the time of writing it the book, I didn’t ask myself that question at all, and I don’t think it really matters ultimately due to being in comparison. I think I can suggest swapping the order from what I typically write, but I would never call it out in a code review, if that helps qualify the strength of how I feel about this.

Also Liked

rustkas

rustkas

Fred, thanks a lot for the detailed answer. Your invaluable experience and the order of thought is very interesting, as it helps to better understand your plan and priorities.

The tool (rebar3), thanks to which it is easy and pleasant to learn Erlang, helps a lot.

Where Next?

Popular Pragmatic Bookshelf topics Top

simonpeter
When I try the command to create a pair of migration files I get an error. user=> (create-migration "guestbook") Execution error (Ill...
New
Mmm
Hi, build fails on: bracket-lib = “~0.8.1” when running on Mac Mini M1 Rust version 1.5.0: Compiling winit v0.22.2 error[E0308]: mi...
New
Chrichton
Dear Sophie. I tried to do the “Authorization” exercise and have two questions: When trying to plug in an email-service, I found the ...
New
curtosis
Running mix deps.get in the sensor_hub directory fails with the following error: ** (Mix) No SSH public keys found in ~/.ssh. An ssh aut...
New
brunogirin
When I run the coverage example to report on missing lines, I get: pytest --cov=cards --report=term-missing ch7 ERROR: usage: pytest [op...
New
dsmith42
Hey there, I’m enjoying this book and have learned a few things alredayd. However, in Chapter 4 I believe we are meant to see the “>...
New
adamwoolhether
Is there any place where we can discuss the solutions to some of the exercises? I can figure most of them out, but am having trouble with...
New
tkhobbes
After some hassle, I was able to finally run bin/setup, now I have started the rails server but I get this error message right when I vis...
New
ggerico
I got this error when executing the plot files on macOS Ventura 13.0.1 with Python 3.10.8 and matplotlib 3.6.1: programming_ML/code/03_...
New
redconfetti
Docker-Machine became part of the Docker Toolbox, which was deprecated in 2020, long after Docker Desktop supported Docker Engine nativel...
New

Other popular topics Top

AstonJ
If it’s a mechanical keyboard, which switches do you have? Would you recommend it? Why? What will your next keyboard be? Pics always w...
New
PragmaticBookshelf
Ruby, Io, Prolog, Scala, Erlang, Clojure, Haskell. With Seven Languages in Seven Weeks, by Bruce A. Tate, you’ll go beyond the syntax—and...
New
brentjanderson
Bought the Moonlander mechanical keyboard. Cherry Brown MX switches. Arms and wrists have been hurting enough that it’s time I did someth...
New
AstonJ
We have a thread about the keyboards we have, but what about nice keyboards we come across that we want? If you have seen any that look n...
New
foxtrottwist
A few weeks ago I started using Warp a terminal written in rust. Though in it’s current state of development there are a few caveats (tab...
New
mafinar
This is going to be a long an frequently posted thread. While talking to a friend of mine who has taken data structure and algorithm cou...
New
PragmaticBookshelf
Rails 7 completely redefines what it means to produce fantastic user experiences and provides a way to achieve all the benefits of single...
New
AstonJ
Was just curious to see if any were around, found this one: I got 51/100: Not sure if it was meant to buy I am sure at times the b...
New
DevotionGeo
I have always used antique keyboards like Cherry MX 1800 or Cherry MX 8100 and almost always have modified the switches in some way, like...
New
sir.laksmana_wenk
I’m able to do the “artistic” part of game-development; character designing/modeling, music, environment modeling, etc. However, I don’t...
New

Sub Categories: