[erlang-questions] Eunit testing after starting the application

Przemysław Simon Zelazny zelazny@REDACTED
Thu May 31 19:31:18 CEST 2018


> 
> Are you suggesting not doing eunit testing and just running with common 
> tests and using init_per_testcase ? I get that EUnit is easy, but for an 
> application that is already built, when we are trying to test system 
> functionality, maybe it is better to just go full on with the common 
> test suite?

Hi,

from my experience, if you've inherited a big, untested application that 
you want to put tests around, trying to start from a "unit-test" level 
will be 1) difficult, 2) counterproductive.

1) is because you're trying to capture units of functionality when it's 
clear that the application was not designed in a modular, isolated 
fashion. So you end up launching-the-world (or mocking-the-world), which 
is tedious and leads to..

2) counterproductive, brittle tests. You're now baking in the coupling 
that the application has to its dependencies and making that coupling a 
contract. You're only adding to the snowball that you've got.

Instead of the above, I'd recommend putting in place a suite of true 
end-to-end tests, and capturing the black-box behavior of your system.

# Makefile
.PHONY: all rel run e2e-test

all: rel run e2e-test
	@echo "E2E tests passed"

rel:
	rebar3 release
run:
	_build/blahblah/yourapp start
	wait_for_it localhost yourport

e2e-test:
	rebar3 ct


Now, your Common Tests will have to assume some things about the system, 
but these assumptions will only reveal what your clients are assuming 
anyway. The benefit is you've decoupled knowledge of internals from a 
behavioral specification of your system.

Now, you can go in and re-write/re-factor particular modules, and cover 
them with true unit tests, eliminating as much coupling as possible.

See here: https://mike-bland.com/2011/11/01/small-medium-large.html for 
a nice overview of testing levels at Google.

Cheers,
Simon Zelazny


> 
> 
> 
> On May 31, 2018, 11:42 AM -0400, Gleb Vinogradov 
> <g.a.vinogradov@REDACTED>, wrote:
>> You can use CommonTest to bootstrap your application. Set environment 
>> variables, start applications etc in CommonTest and run EUnit test then.
>>
>> 2018-05-31 22:24 GMT+07:00 Code Wiget <codewiget95@REDACTED 
>> <mailto:codewiget95@REDACTED>>:
>>
>>     Hey everyone,
>>
>>     How do you go about EUnit testing that requires the whole
>>     application to be running before the test ?
>>
>>     For example, my erlang application starts one pool of processes
>>     that connects to a database and another that connects to another
>>     server in our backend. To run any real tests, I’m going to need to
>>     have one or both of those systems up and running. The way that I’m
>>     doing is right now is below, and it is very cluge-y feeling:
>>
>>     ok = application:start(compiler),
>>     ok = application:start(syntax_tools),
>>     ok = application:start(goldrush),
>>     ok = application:start(gproc),
>>     ok = application:start(gen_logger),
>>     ok = application:start(pooler),
>>     ok = application:start(quickrand),
>>     ok = application:start(re2),
>>     ok = application:start(lz4),
>>     ok = application:start(uuid),
>>     ok = application:start(semver),
>>     ok = application:start(snappy),
>>     ok = application:start(cqerl),
>>     ok = application:start(ecpool),
>>     ok = application:start(esockd),
>>     ok = application:start(lager_syslog),
>>     ok = application:start(lager),
>>
>>
>>     This system works because none of the above applications require
>>     any environment variables from a config file. So some of my other
>>     applications can’t run using this. Is there any way to have eunit
>>     run the test after starting the whole application?
>>
>>     Thanks!
>>
>>
>>
>>     _______________________________________________
>>     erlang-questions mailing list
>>     erlang-questions@REDACTED <mailto:erlang-questions@REDACTED>
>>     http://erlang.org/mailman/listinfo/erlang-questions
>>     <http://erlang.org/mailman/listinfo/erlang-questions>
>>
>>
> 
> 
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions
> 




More information about the erlang-questions mailing list