SlideShare una empresa de Scribd logo
1 de 45
Descargar para leer sin conexión
Eunit




         Richard Carlsson
            Kreditor Europe AB

   (Translated by SHIBUKAWA Yoshiki)
qD `YZ          [ = yoshiki@shibu.jp ]
Eunit /       xUnit        c

]          [8QLW   c            223 *
     `a c` c                c`    
    (UODQJ _ `        a   

(XQLW  IXQ (UODQJ          [   c`a=
      c        c           ^    ^
(XQLW  3           Z
c`                 a

.../myproject/
              Makefile

             src/
                 *.{erl,hrl}

             ebin/
                 *.beam
ca .` a

#      c Makefile
ERLC_FLAGS=
SOURCES=$(wildcard src/*.erl)
HEADERS=$(wildcard src/*.hrl)
OBJECTS=$(SOURCES:src/%.erl=ebin/%.beam)
all: $(OBJECTS) test
ebin/%.beam : src/%.erl $(HEADERS) Makefile
   erlc $(ERLC_FLAGS) -o ebin/ $
clean:
   -rm $(OBJECTS)
test:
   erl -noshell -pa ebin 
    -eval 'eunit:test(ebin,[verbose])' 
    -s init stop
c`           a      c        cb          c

%%     c= :   src/global.hrl

-include_lib(eunit/include/eunit.hrl).
`                 c

%%       c= :   src/empty.erl

-module(empty).

-include(global.hrl).


%%              `a           ^]

a_test() - ok.
c         `a

$ make
erlc -o ebin/ src/empty.erl
erl -noshell -pa ebin 
    -eval 'eunit:test(ebin,[verbose])' 
    -s init stop
====================== EUnit ======================
directory ebin
  empty:a_test (module 'empty')...ok
  [done in 0.007 s]
===================================================
  Test successful.
$
test                  _     `b a       ^^

1 empty:module_info(exports).
[{a_test,0},{test,0},{module_info,0},
{module_info,1}]
2 empty:test().
  Test passed.
ok
3 eunit:test(empty).
  Test passed.
ok
4 empty:a_test().
ok
5 eunit:test({empty,a_test}).
  Test passed.
ok
6
`a

ERLC_FLAGS=-DNOTEST         makefile            ^
   = `a                         c ^        Z

   # A simple Makefile
   ERLC_FLAGS=-DNOTEST
   ...

       `a                     a      ca
^=” make release”          ^           Z]
   release: clean
      $(MAKE) ERLC_FLAGS=$(ERLC_FLAGS) -DNOTEST
`a                        a               c

$ make
erlc -DNOTEST -o ebin/ src/empty.erl
erl -noshell -pa ebin 
    -eval 'eunit:test(ebin,[verbose])' 
    -s init stop
====================== EUnit ======================
directory ebin
  module 'empty'
  [done in 0.004 s]
  There were no tests to run.
$
`a           Z         Z          [

1 empty:module_info(exports).
[{module_info,0},{module_info,1}]
2 eunit:test(empty).
  There were no tests to run.
ok
3
_ca             `a                        
c  cb               c NOTEST
 c ^ =            _ca   `a    
    %%        : src/global.hrl

    -define(NOTEST, true).
    -include_lib(eunit/include/eunit.hrl).

   = TEST  makefile                 ^
= NOTEST    Z Z^

`a            ^        makefile          a        
^         Z^

        [=PZ ]                  Z[
`a              aV        
 `a         a       [ 

  eunit.hrl     cc ` `Z
  EUnit        `           Z ^
        c ^[ `a             EUnit 

            =    [     aZ          ^
  EUnit         _ `b a         2 ]
EUnit Z          Z    a        c

  B             = Z         c Z    Z ^
`a Z

%%        : src/fib.erl
-module(fib).
-export([f/1]).
-include(global.hrl).

f(0) - 1;
f(1) - 1;
f(N) when N  1 - f(N-1) * f(N-2).

f_test() -
    1 = f(0),
    1 = f(1),
    2 = f(2).
Badmatch Z             =         

====================== EUnit ======================
directory ebin
  fib: f_test (module 'fib')...*failed*
::error:{badmatch,1}
  in function fib:f_test/0

===================================================
  Failed: 1. Skipped: 0. Passed: 0.
`a               Z            ^

%%        : src/fib.erl
-module(fib).
-export([f/1]).
-include(global.hrl).

f(0) - 1;
f(1) - 1;
f(N) when N  1 - f(N-1) * f(N-2).

f0_test() - 1 = f(0).

f1_test() - 1 = f(1).

f2_test() - 2 = f(2).
Z                   Z         ]

====================== EUnit ======================
directory ebin
  module 'fib'
    fib: f0_test...ok
    fib: f1_test...ok
    fib: f2_test...*failed*
::error:{badmatch,1}
  in function fib:f2_test/0

    [done in 0.024 s]
===================================================
  Failed: 1. Skipped: 0. Passed: 0.
assert             =H Z

%%        : src/fib.erl
-module(fib).
-export([f/1]).
-include(global.hrl).

f(0) - 1;
f(1) - 1;
f(N) when N  1 - f(N-1) * f(N-2).

f0_test() - ?assertEqual(1, f(0)).

f1_test() - ?assertEqual(1, f(1)).

f2_test() - ?assertEqual(2, f(2)).
^ ^                 ]

====================== EUnit ======================
directory ebin
  module 'fib'
    fib: f0_test...ok
    fib: f1_test...ok
    fib: f2_test...*failed*
::error:{assertEqual_failed,[{module,fib},
                           {line,14},
                           {expression,f ( 2 )},
                           {expected,2},
                           {value,1}]}
  in function fib:'-f2_test/0-fun-0-'/1
!       assert

%% File: src/fib.erl
-module(fib).
-export([f/1]).
-include(global.hrl).

f(0) - 1;
f(1) - 1;
f(N) when N  1 - f(N-1) * f(N-2).

f_test() -
    ?assertEqual(1,   f(0)),
    ?assertEqual(1,   f(1)),
    ?assertEqual(2,   f(2)),
    ?assertEqual(3,   f(3)).
*%                         ]

====================== EUnit ======================
directory ebin
  fib: f_test (module 'fib')...*failed*
::error:{assertEqual_failed,[{module,fib},
                           {line,13},
                           {expression,f ( 2 )},
                           {expected,2},
                           {value,1}]}
  in function fib:'-f_test/0-fun-2-'/1
  in call from fib:f_test/0
`    ac                               ^

%%        : src/fib.erl
-module(fib).
-export([f/1]).
-include(global.hrl).

f(0) - 1;
f(1) - 1;
f(N) when N  1 - f(N-1) * f(N-2).

f_test_() -
    [?_assertEqual(1,   f(0)),
     ?_assertEqual(1,   f(1)),
     ?_assertEqual(2,   f(2)),
     ?_assertEqual(3,   f(3))].
^[ `a` a                          ]

    fib:11: f_test_...ok
    fib:12: f_test_...ok
    fib:13: f_test_...*failed*
::error:{assertEqual_failed,[{module,fib},
                           {line,13},
                           {expression,f ( 2 )},
                           {expected,2},
                           {value,1}]}
  in function fib:'-f_test_/0-fun-4-'/1
    fib:14: f_test_...*failed*
::error:{assertEqual_failed,[{module,fib},
                           {line,14},
                           {expression,f ( 3 )},
                           {expected,3},
                           {value,1}]}
  in function fib:'-f_test_/0-fun-6-'/1
_c           `a          `           ^ 

%%        : src/fib.erl
-module(fib).
-export([f/1]).
-include(global.hrl).

f(0) - 1;
f(1) - 1;
f(N) when N  1 - f(N-1) + f(N-2).

f_test_() -
  [?_assertEqual(1, f(0)),
   ?_assertEqual(1, f(1)),
   ?_assertEqual(2, f(2)),
   ?_assertError(function_clause, f(-1)),
   ?_assert(f(31) =:= 2178309)].
]Z Z] [=                         S

====================== EUnit ======================
directory ebin
  module 'fib'
    fib:11: f_test_...ok
    fib:12: f_test_...ok
    fib:13: f_test_...ok
    fib:14: f_test_...ok
    fib:15: f_test_...[0.394 s] ok
    [done in 0.432 s]
===================================================
  All 5 tests passed.
`a         `        c              ^

%%        : src/fib_tests.erl
-module(fib_tests).
-include(global.hrl).

f_test_() -
  [?_assertEqual(1, fib:f(0)),
   ?_assertEqual(1, fib:f(1)),
   ?_assertEqual(2, fib:f(2)),
   ?_assertError(function_clause, fib:f(-1)),
   ?_assert(fib:f(31) =:= 2178309)].
^]

1 eunit:test(fib, [verbose]).
====================== EUnit ======================
module 'fib'
  module 'fib_tests'
    fib_tests:6: f_test_...ok
    fib_tests:7: f_test_...ok
    fib_tests:8: f_test_...ok
    fib_tests:9: f_test_...ok
    fib_tests:11: f_test_...[0.405 s] ok
    [done in 0.442 s]
  [done in 0.442 s]
===================================================
  All 5 tests passed.
c c` 

%%        : src/fib.erl
-module(fib).
-export([f/1, g/1]).

f(0) - 1;
f(1) - 1;
f(N) when N  1 - f(N-1) + f(N-2).


g(N) when N = 0 - g(N, 0, 1).

g(0, _F1, F2) - F2;
g(N, F1, F2) - g(N - 1, F2, F1 + F2).
U                      ^ `aZ

%%        : src/fib_tests.erl
-module(fib_tests).
-include(global.hrl).

f_test_() -
  [...].

g_test_() -
    [?_assertError(function_clause, fib:g(-1)),
     ?_assertEqual(fib:f(0), fib:g(0)),
     ?_assertEqual(fib:f(1), fib:g(1)),
     ?_assertEqual(fib:f(2), fib:g(2)),
     ?_assertEqual(fib:f(17), fib:g(17)),
     ?_assertEqual(fib:f(31), fib:g(31))].
YZ `a ]

====================== EUnit ======================
module 'fib'
  module 'fib_tests'
    fib_tests:6: f_test_...ok
    fib_tests:7: f_test_...ok
    fib_tests:8: f_test_...ok
    fib_tests:9: f_test_...ok
    fib_tests:11: f_test_...[0.397 s] ok
    fib_tests:14: g_test_...ok
    fib_tests:16: g_test_...ok
    fib_tests:17: g_test_...ok
    fib_tests:18: g_test_...ok
    fib_tests:19: g_test_...ok
    fib_tests:20: g_test_...[0.425 s] ok
===================================================
  All 11 tests passed.
`a                 Z] Z

%%        : src/fib_tests.erl
-module(fib_tests).
-include(global.hrl).

f_test_() -
  [...].

g_test_() -
    [?_assertEqual(fib:f(N), fib:g(N))
     || N - lists:seq(0,33)].

g_error_test() -
    ?assertError(function_clause, fib:g(-1)).
ZZZ                 ]      Z

    fib_tests:17: g_test_...ok
    fib_tests:17: g_test_...ok
    ...
    fib_tests:17: g_test_...[0.001 s] ok
    fib_tests:17: g_test_...[0.002 s] ok
    fib_tests:17: g_test_...[0.003 s] ok
    fib_tests:17: g_test_...[0.005 s] ok
    fib_tests:17: g_test_...[0.008 s] ok
    fib_tests:17: g_test_...[0.013 s] ok
    fib_tests:17: g_test_...[0.021 s] ok
    ...
    fib_tests:17: g_test_...[0.566 s] ok
    fib_tests:17: g_test_...[0.939 s] ok
    [done in 3.148 s]
===================================================
  All 40 tests passed.
`a               Z
    ZZZ^                   ^     Z]
                     ^   ^][
*= ZZ^                  ` _        ]
        a       .(   `c   

        c`a= ]c`a=a ]c`a

c               [ `a        `    Z Z
        [              ^   [[ =           
2        ^
c            ?E                        ]

%%       : src/fib_tests.erl
-module(fib_tests).
-include(global.hrl).

...

g_test_() -
    {inparallel,
     [?_assertEqual(fib:f(N), fib:g(N))
      || N - lists:seq(0,33)]
    }.

...
=] ]                        [ 

    fib_tests:17: g_test_...ok
    fib_tests:17: g_test_...ok
    ...
    fib_tests:17: g_test_...[0.001 s] ok
    fib_tests:17: g_test_...ok
    fib_tests:17: g_test_...[0.003 s] ok
    fib_tests:17: g_test_...[0.011 s] ok
    fib_tests:17: g_test_...[0.015 s] ok
    fib_tests:17: g_test_...[0.023 s] ok
    fib_tests:17: g_test_...[0.036 s] ok
    ...
    fib_tests:17: g_test_...[1.378 s] ok
    fib_tests:17: g_test_...[1.085 s] ok
    [done in 1.853 s]
===================================================
  All 40 tests passed.
-                                   c``

%%        : src/adder.erl
-module(adder).
-export([start/0, stop/1, add/2]).
start() - spawn(fun server/0).
stop(Pid) - Pid ! stop.
add(D, Pid) -
  Pid ! {add, D, self()},
  receive {adder, N} - N end.

server() - server(0).
server(N) -
  receive
    {add, D, From} -
        From ! {adder, N + D},   server(N + D);
    stop - ok
  end.
n          `         |

%%        : src/adder_tests.erl
-module(adder_tests).
-include(global.hrl).

named_test_() -
  {setup,
   fun()- P=adder:start(), register(srv, P), P end,
   fun adder:stop/1,
   [?_assertEqual(0, adder:add(0, srv)),
    ?_assertEqual(1, adder:add(1, srv)),
    ?_assertEqual(11, adder:add(10, srv)),
    ?_assertEqual(6, adder:add(-5, srv)),
    ?_assertEqual(-5, adder:add(-11, srv)),
    ?_assertEqual(0, adder:add(-adder:add(0, srv),
                               srv))]
  }.
`a                 `         `

...

anonymous_test_() -
  {setup, fun adder:start/0, fun adder:stop/1,
   fun (Srv) -
    {inorder,    %%
     [?_assertEqual(0, adder:add(0, Srv)),
                       W          U      W

      ?_assertEqual(1, adder:add(1, Srv)),
      ?_assertEqual(11, adder:add(10, Srv)),
      ?_assertEqual(6, adder:add(-5, Srv)),
      ?_assertEqual(-5, adder:add(-11, Srv)),
      ?_assertEqual(0, adder:add(-adder:add(0, Srv),
                                 Srv))]
    }
   end}.
Z Z assert              -            `a

anonymous_test_() -
  {setup, fun adder:start/0, fun adder:stop/1,
   fun (Srv) -
    [?_test(
      begin
       ?assertEqual(0, adder:add(0, Srv)),
       ?assertEqual(1, adder:add(1, Srv)),
       ?assertEqual(11, adder:add(10, Srv)),
       ?assertEqual(6, adder:add(-5, Srv)),
       ?assertEqual(-5, adder:add(-11, Srv)),
       ?assertEqual(0, adder:add(-adder:add(0, Srv),
                                 Srv))
      end)]
   end}.
`a                 b 8

anonymous_test_() -
  {setup, fun adder:start/0, fun adder:stop/1,
   fun (Srv) -
    [?_test(
      begin
       assert_add( 0, 0, Srv),
       ...
       assert_add(-11, -5, Srv),
       assert_add(-adder:add(0, Srv), 0, Srv)
      end
     )]
   end}.

assert_add(D, N, Srv) -
  ?assertEqual(N, adder:add(D, Srv)).
`a                     F

anonymous_test_() -
  {setup, fun adder:start/0, fun adder:stop/1,
   fun (Srv) -
    {with, Srv,
      [fun first_subtest/1, ...]
    }
   end}.

first_subtest(Srv) -
  assert_add( 0, 0, Srv),
  ...
  assert_add(-11, -5, Srv),
  assert_add(-adder:add(0, Srv), 0, Srv).

assert_add(D, N, Srv) -
  ?assertEqual(N, adder:add(D, Srv)).
'with'    '        [        `          a

anonymous_test_() -
  {setup, fun adder:start/0, fun adder:stop/1,
    {with,
      [fun first_subtest/1,
       ...]
    }
  }.

first_subtest(Srv) -
  assert_add( 0, 0, Srv),
  ...
  assert_add(-11, -5, Srv),
  assert_add(-adder:add(0, Srv), 0, Srv).

assert_add(D, N, Srv) -
  ?assertEqual(N, adder:add(D, Srv)).
`a                a Z                y       [
 `a         a        a       Y

        a !          
                   [ '     ^      [
    `a       a c            c      [
(UODQJ           Z       ^          ^ 

         ^^        
S          F
  
S        a -ifdef(TEST)                    c
(8QLW   a       c

            
S ^         [Z       -       ]
2.1  
EUNIT    `              (     “[verbose]”)

A cb a `                      9Z
             a                   [ 
  cb a                _ a[                 `    c
  Maven (“surefire”)        b a
    `a` a                  ac       `           
                       ZZ[^             
             ^` ac              Z       ^           [
      ^[                   '         8   [
] Z

Más contenido relacionado

La actualidad más candente

Unbreakable: The Craft of Code
Unbreakable: The Craft of CodeUnbreakable: The Craft of Code
Unbreakable: The Craft of CodeJoe Morgan
 
Building Real Time Systems on MongoDB Using the Oplog at Stripe
Building Real Time Systems on MongoDB Using the Oplog at StripeBuilding Real Time Systems on MongoDB Using the Oplog at Stripe
Building Real Time Systems on MongoDB Using the Oplog at StripeStripe
 
20190330 immutable data
20190330 immutable data20190330 immutable data
20190330 immutable dataChiwon Song
 
Building Real Time Systems on MongoDB Using the Oplog at Stripe
Building Real Time Systems on MongoDB Using the Oplog at StripeBuilding Real Time Systems on MongoDB Using the Oplog at Stripe
Building Real Time Systems on MongoDB Using the Oplog at StripeMongoDB
 
20180721 code defragment
20180721 code defragment20180721 code defragment
20180721 code defragmentChiwon Song
 
Going Loopy - Adventures in Iteration with Google Go
Going Loopy - Adventures in Iteration with Google GoGoing Loopy - Adventures in Iteration with Google Go
Going Loopy - Adventures in Iteration with Google GoEleanor McHugh
 
20180310 functional programming
20180310 functional programming20180310 functional programming
20180310 functional programmingChiwon Song
 
Comparative Genomics with GMOD and BioPerl
Comparative Genomics with GMOD and BioPerlComparative Genomics with GMOD and BioPerl
Comparative Genomics with GMOD and BioPerlJason Stajich
 
20181020 advanced higher-order function
20181020 advanced higher-order function20181020 advanced higher-order function
20181020 advanced higher-order functionChiwon Song
 
Async code on kotlin: rx java or/and coroutines - Kotlin Night Turin
Async code on kotlin: rx java or/and coroutines - Kotlin Night TurinAsync code on kotlin: rx java or/and coroutines - Kotlin Night Turin
Async code on kotlin: rx java or/and coroutines - Kotlin Night TurinFabio Collini
 
Extreme JavaScript Performance
Extreme JavaScript PerformanceExtreme JavaScript Performance
Extreme JavaScript PerformanceThomas Fuchs
 
PHP tips and tricks
PHP tips and tricks PHP tips and tricks
PHP tips and tricks Damien Seguy
 
Python for High School Programmers
Python for High School ProgrammersPython for High School Programmers
Python for High School ProgrammersSiva Arunachalam
 
Chapter 2: R tutorial Handbook for Data Science and Machine Learning Practiti...
Chapter 2: R tutorial Handbook for Data Science and Machine Learning Practiti...Chapter 2: R tutorial Handbook for Data Science and Machine Learning Practiti...
Chapter 2: R tutorial Handbook for Data Science and Machine Learning Practiti...Raman Kannan
 
8時間耐久CakePHP2 勉強会
8時間耐久CakePHP2 勉強会8時間耐久CakePHP2 勉強会
8時間耐久CakePHP2 勉強会Yusuke Ando
 
20191116 custom operators in swift
20191116 custom operators in swift20191116 custom operators in swift
20191116 custom operators in swiftChiwon Song
 
Building Real Time Systems on MongoDB Using the Oplog at Stripe
Building Real Time Systems on MongoDB Using the Oplog at StripeBuilding Real Time Systems on MongoDB Using the Oplog at Stripe
Building Real Time Systems on MongoDB Using the Oplog at StripeMongoDB
 

La actualidad más candente (20)

Unbreakable: The Craft of Code
Unbreakable: The Craft of CodeUnbreakable: The Craft of Code
Unbreakable: The Craft of Code
 
Meck
MeckMeck
Meck
 
Building Real Time Systems on MongoDB Using the Oplog at Stripe
Building Real Time Systems on MongoDB Using the Oplog at StripeBuilding Real Time Systems on MongoDB Using the Oplog at Stripe
Building Real Time Systems on MongoDB Using the Oplog at Stripe
 
20190330 immutable data
20190330 immutable data20190330 immutable data
20190330 immutable data
 
Building Real Time Systems on MongoDB Using the Oplog at Stripe
Building Real Time Systems on MongoDB Using the Oplog at StripeBuilding Real Time Systems on MongoDB Using the Oplog at Stripe
Building Real Time Systems on MongoDB Using the Oplog at Stripe
 
20180721 code defragment
20180721 code defragment20180721 code defragment
20180721 code defragment
 
Going Loopy - Adventures in Iteration with Google Go
Going Loopy - Adventures in Iteration with Google GoGoing Loopy - Adventures in Iteration with Google Go
Going Loopy - Adventures in Iteration with Google Go
 
20180310 functional programming
20180310 functional programming20180310 functional programming
20180310 functional programming
 
Comparative Genomics with GMOD and BioPerl
Comparative Genomics with GMOD and BioPerlComparative Genomics with GMOD and BioPerl
Comparative Genomics with GMOD and BioPerl
 
Elixir cheatsheet
Elixir cheatsheetElixir cheatsheet
Elixir cheatsheet
 
20181020 advanced higher-order function
20181020 advanced higher-order function20181020 advanced higher-order function
20181020 advanced higher-order function
 
Calvix python
Calvix pythonCalvix python
Calvix python
 
Async code on kotlin: rx java or/and coroutines - Kotlin Night Turin
Async code on kotlin: rx java or/and coroutines - Kotlin Night TurinAsync code on kotlin: rx java or/and coroutines - Kotlin Night Turin
Async code on kotlin: rx java or/and coroutines - Kotlin Night Turin
 
Extreme JavaScript Performance
Extreme JavaScript PerformanceExtreme JavaScript Performance
Extreme JavaScript Performance
 
PHP tips and tricks
PHP tips and tricks PHP tips and tricks
PHP tips and tricks
 
Python for High School Programmers
Python for High School ProgrammersPython for High School Programmers
Python for High School Programmers
 
Chapter 2: R tutorial Handbook for Data Science and Machine Learning Practiti...
Chapter 2: R tutorial Handbook for Data Science and Machine Learning Practiti...Chapter 2: R tutorial Handbook for Data Science and Machine Learning Practiti...
Chapter 2: R tutorial Handbook for Data Science and Machine Learning Practiti...
 
8時間耐久CakePHP2 勉強会
8時間耐久CakePHP2 勉強会8時間耐久CakePHP2 勉強会
8時間耐久CakePHP2 勉強会
 
20191116 custom operators in swift
20191116 custom operators in swift20191116 custom operators in swift
20191116 custom operators in swift
 
Building Real Time Systems on MongoDB Using the Oplog at Stripe
Building Real Time Systems on MongoDB Using the Oplog at StripeBuilding Real Time Systems on MongoDB Using the Oplog at Stripe
Building Real Time Systems on MongoDB Using the Oplog at Stripe
 

Destacado

Go & multi platform GUI Trials and Errors
Go & multi platform GUI Trials and ErrorsGo & multi platform GUI Trials and Errors
Go & multi platform GUI Trials and ErrorsYoshiki Shibukawa
 
Erlang Developments: The Good, The Bad and The Ugly
Erlang Developments: The Good, The Bad and The UglyErlang Developments: The Good, The Bad and The Ugly
Erlang Developments: The Good, The Bad and The Uglyenriquepazperez
 
FINAL FANTASY Record Keeperを支えたGolang
FINAL FANTASY Record Keeperを支えたGolangFINAL FANTASY Record Keeperを支えたGolang
FINAL FANTASY Record Keeperを支えたGolangYoshiki Shibukawa
 

Destacado (6)

Go & multi platform GUI Trials and Errors
Go & multi platform GUI Trials and ErrorsGo & multi platform GUI Trials and Errors
Go & multi platform GUI Trials and Errors
 
Erlang Developments: The Good, The Bad and The Ugly
Erlang Developments: The Good, The Bad and The UglyErlang Developments: The Good, The Bad and The Ugly
Erlang Developments: The Good, The Bad and The Ugly
 
Mithril
MithrilMithril
Mithril
 
アンラーニング
アンラーニングアンラーニング
アンラーニング
 
Excelの話
Excelの話Excelの話
Excelの話
 
FINAL FANTASY Record Keeperを支えたGolang
FINAL FANTASY Record Keeperを支えたGolangFINAL FANTASY Record Keeperを支えたGolang
FINAL FANTASY Record Keeperを支えたGolang
 

Similar a EUnit in Practice(Japanese)

From Javascript To Haskell
From Javascript To HaskellFrom Javascript To Haskell
From Javascript To Haskellujihisa
 
Hacking ansible
Hacking ansibleHacking ansible
Hacking ansiblebcoca
 
Testing My Patience
Testing My PatienceTesting My Patience
Testing My PatienceAdam Lowry
 
Implementing the IO Monad in Scala
Implementing the IO Monad in ScalaImplementing the IO Monad in Scala
Implementing the IO Monad in ScalaHermann Hueck
 
ES6 PPT FOR 2016
ES6 PPT FOR 2016ES6 PPT FOR 2016
ES6 PPT FOR 2016Manoj Kumar
 
JavaScript for PHP developers
JavaScript for PHP developersJavaScript for PHP developers
JavaScript for PHP developersStoyan Stefanov
 
Frege is a Haskell for the JVM
Frege is a Haskell for the JVMFrege is a Haskell for the JVM
Frege is a Haskell for the JVMjwausle
 
An introduction to Google test framework
An introduction to Google test frameworkAn introduction to Google test framework
An introduction to Google test frameworkAbner Chih Yi Huang
 
Jsphp 110312161301-phpapp02
Jsphp 110312161301-phpapp02Jsphp 110312161301-phpapp02
Jsphp 110312161301-phpapp02Seri Moth
 
스위프트를 여행하는 히치하이커를 위한 스타일 안내
스위프트를 여행하는 히치하이커를 위한 스타일 안내스위프트를 여행하는 히치하이커를 위한 스타일 안내
스위프트를 여행하는 히치하이커를 위한 스타일 안내Jung Kim
 
Consider the following C code snippet C codevoid setArray(int.pdf
Consider the following C code snippet C codevoid setArray(int.pdfConsider the following C code snippet C codevoid setArray(int.pdf
Consider the following C code snippet C codevoid setArray(int.pdfarihantmum
 
Haskellで学ぶ関数型言語
Haskellで学ぶ関数型言語Haskellで学ぶ関数型言語
Haskellで学ぶ関数型言語ikdysfm
 
Gevent what's the point
Gevent what's the pointGevent what's the point
Gevent what's the pointseanmcq
 
Being functional in PHP
Being functional in PHPBeing functional in PHP
Being functional in PHPDavid de Boer
 

Similar a EUnit in Practice(Japanese) (20)

EcmaScript 6
EcmaScript 6 EcmaScript 6
EcmaScript 6
 
From Javascript To Haskell
From Javascript To HaskellFrom Javascript To Haskell
From Javascript To Haskell
 
Hacking ansible
Hacking ansibleHacking ansible
Hacking ansible
 
Testing My Patience
Testing My PatienceTesting My Patience
Testing My Patience
 
Implementing the IO Monad in Scala
Implementing the IO Monad in ScalaImplementing the IO Monad in Scala
Implementing the IO Monad in Scala
 
Introducing to Asynchronous Programming
Introducing to Asynchronous  ProgrammingIntroducing to Asynchronous  Programming
Introducing to Asynchronous Programming
 
ES6 PPT FOR 2016
ES6 PPT FOR 2016ES6 PPT FOR 2016
ES6 PPT FOR 2016
 
JavaScript for PHP developers
JavaScript for PHP developersJavaScript for PHP developers
JavaScript for PHP developers
 
Frege is a Haskell for the JVM
Frege is a Haskell for the JVMFrege is a Haskell for the JVM
Frege is a Haskell for the JVM
 
An introduction to Google test framework
An introduction to Google test frameworkAn introduction to Google test framework
An introduction to Google test framework
 
Jsphp 110312161301-phpapp02
Jsphp 110312161301-phpapp02Jsphp 110312161301-phpapp02
Jsphp 110312161301-phpapp02
 
ES2015 workflows
ES2015 workflowsES2015 workflows
ES2015 workflows
 
스위프트를 여행하는 히치하이커를 위한 스타일 안내
스위프트를 여행하는 히치하이커를 위한 스타일 안내스위프트를 여행하는 히치하이커를 위한 스타일 안내
스위프트를 여행하는 히치하이커를 위한 스타일 안내
 
Consider the following C code snippet C codevoid setArray(int.pdf
Consider the following C code snippet C codevoid setArray(int.pdfConsider the following C code snippet C codevoid setArray(int.pdf
Consider the following C code snippet C codevoid setArray(int.pdf
 
Say It With Javascript
Say It With JavascriptSay It With Javascript
Say It With Javascript
 
Javascript
JavascriptJavascript
Javascript
 
Haskellで学ぶ関数型言語
Haskellで学ぶ関数型言語Haskellで学ぶ関数型言語
Haskellで学ぶ関数型言語
 
Gevent what's the point
Gevent what's the pointGevent what's the point
Gevent what's the point
 
Being functional in PHP
Being functional in PHPBeing functional in PHP
Being functional in PHP
 
Workshop 10: ECMAScript 6
Workshop 10: ECMAScript 6Workshop 10: ECMAScript 6
Workshop 10: ECMAScript 6
 

Más de Yoshiki Shibukawa

技術書執筆のススメ 〜Only1なエンジニアになるためのセルフブランディング〜の発表資料
技術書執筆のススメ 〜Only1なエンジニアになるためのセルフブランディング〜の発表資料技術書執筆のススメ 〜Only1なエンジニアになるためのセルフブランディング〜の発表資料
技術書執筆のススメ 〜Only1なエンジニアになるためのセルフブランディング〜の発表資料Yoshiki Shibukawa
 
GO本執筆者が語る、2064年もITで仕事し続けるためのキャリアプランの発表資料
GO本執筆者が語る、2064年もITで仕事し続けるためのキャリアプランの発表資料GO本執筆者が語る、2064年もITで仕事し続けるためのキャリアプランの発表資料
GO本執筆者が語る、2064年もITで仕事し続けるためのキャリアプランの発表資料Yoshiki Shibukawa
 
Chunked encoding を使った高速化の考察
Chunked encoding を使った高速化の考察Chunked encoding を使った高速化の考察
Chunked encoding を使った高速化の考察Yoshiki Shibukawa
 
東京Node学園 今できる通信高速化にトライしてみた
東京Node学園 今できる通信高速化にトライしてみた東京Node学園 今できる通信高速化にトライしてみた
東京Node学園 今できる通信高速化にトライしてみたYoshiki Shibukawa
 
Oktavia全文検索エンジン - SphinxCon JP 2014
Oktavia全文検索エンジン - SphinxCon JP 2014Oktavia全文検索エンジン - SphinxCon JP 2014
Oktavia全文検索エンジン - SphinxCon JP 2014Yoshiki Shibukawa
 
Oktavia Search Engine - pyconjp2014
Oktavia Search Engine - pyconjp2014Oktavia Search Engine - pyconjp2014
Oktavia Search Engine - pyconjp2014Yoshiki Shibukawa
 
Expert JavaScript Programming
Expert JavaScript ProgrammingExpert JavaScript Programming
Expert JavaScript ProgrammingYoshiki Shibukawa
 
JavaScriptゲーム制作勉強会
JavaScriptゲーム制作勉強会JavaScriptゲーム制作勉強会
JavaScriptゲーム制作勉強会Yoshiki Shibukawa
 
ドキュメントを作りたくなってしまう魔法のツール「Sphinx」
ドキュメントを作りたくなってしまう魔法のツール「Sphinx」ドキュメントを作りたくなってしまう魔法のツール「Sphinx」
ドキュメントを作りたくなってしまう魔法のツール「Sphinx」Yoshiki Shibukawa
 
つまみぐい勉強法。その後。
つまみぐい勉強法。その後。つまみぐい勉強法。その後。
つまみぐい勉強法。その後。Yoshiki Shibukawa
 
Sphinx Tutorial at BPStudy#30
Sphinx Tutorial at BPStudy#30Sphinx Tutorial at BPStudy#30
Sphinx Tutorial at BPStudy#30Yoshiki Shibukawa
 
Who is the person whom the IT engineers should learn next to Alexander?
Who is the person whom the IT engineers should learn next to Alexander?Who is the person whom the IT engineers should learn next to Alexander?
Who is the person whom the IT engineers should learn next to Alexander?Yoshiki Shibukawa
 
1日~1週間でOSSに貢献する方法
1日~1週間でOSSに貢献する方法1日~1週間でOSSに貢献する方法
1日~1週間でOSSに貢献する方法Yoshiki Shibukawa
 

Más de Yoshiki Shibukawa (20)

技術書執筆のススメ 〜Only1なエンジニアになるためのセルフブランディング〜の発表資料
技術書執筆のススメ 〜Only1なエンジニアになるためのセルフブランディング〜の発表資料技術書執筆のススメ 〜Only1なエンジニアになるためのセルフブランディング〜の発表資料
技術書執筆のススメ 〜Only1なエンジニアになるためのセルフブランディング〜の発表資料
 
GO本執筆者が語る、2064年もITで仕事し続けるためのキャリアプランの発表資料
GO本執筆者が語る、2064年もITで仕事し続けるためのキャリアプランの発表資料GO本執筆者が語る、2064年もITで仕事し続けるためのキャリアプランの発表資料
GO本執筆者が語る、2064年もITで仕事し続けるためのキャリアプランの発表資料
 
Golang tokyo #7 qtpm
Golang tokyo #7 qtpmGolang tokyo #7 qtpm
Golang tokyo #7 qtpm
 
Chunked encoding を使った高速化の考察
Chunked encoding を使った高速化の考察Chunked encoding を使った高速化の考察
Chunked encoding を使った高速化の考察
 
東京Node学園 今できる通信高速化にトライしてみた
東京Node学園 今できる通信高速化にトライしてみた東京Node学園 今できる通信高速化にトライしてみた
東京Node学園 今できる通信高速化にトライしてみた
 
Oktavia全文検索エンジン - SphinxCon JP 2014
Oktavia全文検索エンジン - SphinxCon JP 2014Oktavia全文検索エンジン - SphinxCon JP 2014
Oktavia全文検索エンジン - SphinxCon JP 2014
 
Oktavia Search Engine - pyconjp2014
Oktavia Search Engine - pyconjp2014Oktavia Search Engine - pyconjp2014
Oktavia Search Engine - pyconjp2014
 
大規模JavaScript開発
大規模JavaScript開発大規模JavaScript開発
大規模JavaScript開発
 
Xpjug基調lt2011
Xpjug基調lt2011Xpjug基調lt2011
Xpjug基調lt2011
 
Expert JavaScript Programming
Expert JavaScript ProgrammingExpert JavaScript Programming
Expert JavaScript Programming
 
JavaScriptゲーム制作勉強会
JavaScriptゲーム制作勉強会JavaScriptゲーム制作勉強会
JavaScriptゲーム制作勉強会
 
Pomodoro technique
Pomodoro techniquePomodoro technique
Pomodoro technique
 
ドキュメントを作りたくなってしまう魔法のツール「Sphinx」
ドキュメントを作りたくなってしまう魔法のツール「Sphinx」ドキュメントを作りたくなってしまう魔法のツール「Sphinx」
ドキュメントを作りたくなってしまう魔法のツール「Sphinx」
 
Bitbucket&mercurial
Bitbucket&mercurialBitbucket&mercurial
Bitbucket&mercurial
 
つまみぐい勉強法。その後。
つまみぐい勉強法。その後。つまみぐい勉強法。その後。
つまみぐい勉強法。その後。
 
Erlang and I and Sphinx.
Erlang and I and Sphinx.Erlang and I and Sphinx.
Erlang and I and Sphinx.
 
Sphinx Tutorial at BPStudy#30
Sphinx Tutorial at BPStudy#30Sphinx Tutorial at BPStudy#30
Sphinx Tutorial at BPStudy#30
 
Who is the person whom the IT engineers should learn next to Alexander?
Who is the person whom the IT engineers should learn next to Alexander?Who is the person whom the IT engineers should learn next to Alexander?
Who is the person whom the IT engineers should learn next to Alexander?
 
1日~1週間でOSSに貢献する方法
1日~1週間でOSSに貢献する方法1日~1週間でOSSに貢献する方法
1日~1週間でOSSに貢献する方法
 
儲かるドキュメント
儲かるドキュメント儲かるドキュメント
儲かるドキュメント
 

Último

Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfLoriGlavin3
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxLoriGlavin3
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxLoriGlavin3
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxBkGupta21
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningLars Bell
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
Sample pptx for embedding into website for demo
Sample pptx for embedding into website for demoSample pptx for embedding into website for demo
Sample pptx for embedding into website for demoHarshalMandlekar2
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxLoriGlavin3
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxLoriGlavin3
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 

Último (20)

Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdf
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptx
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine Tuning
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
Sample pptx for embedding into website for demo
Sample pptx for embedding into website for demoSample pptx for embedding into website for demo
Sample pptx for embedding into website for demo
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptx
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 

EUnit in Practice(Japanese)

  • 1. Eunit Richard Carlsson Kreditor Europe AB (Translated by SHIBUKAWA Yoshiki) qD `YZ [ = yoshiki@shibu.jp ]
  • 2. Eunit / xUnit c ] [8QLW c 223 * `a c` c c` (UODQJ _ ` a (XQLW IXQ (UODQJ [ c`a= c c ^ ^ (XQLW 3 Z
  • 3. c` a .../myproject/ Makefile src/ *.{erl,hrl} ebin/ *.beam
  • 4. ca .` a # c Makefile ERLC_FLAGS= SOURCES=$(wildcard src/*.erl) HEADERS=$(wildcard src/*.hrl) OBJECTS=$(SOURCES:src/%.erl=ebin/%.beam) all: $(OBJECTS) test ebin/%.beam : src/%.erl $(HEADERS) Makefile erlc $(ERLC_FLAGS) -o ebin/ $ clean: -rm $(OBJECTS) test: erl -noshell -pa ebin -eval 'eunit:test(ebin,[verbose])' -s init stop
  • 5. c` a c cb c %% c= : src/global.hrl -include_lib(eunit/include/eunit.hrl).
  • 6. ` c %% c= : src/empty.erl -module(empty). -include(global.hrl). %% `a ^] a_test() - ok.
  • 7. c `a $ make erlc -o ebin/ src/empty.erl erl -noshell -pa ebin -eval 'eunit:test(ebin,[verbose])' -s init stop ====================== EUnit ====================== directory ebin empty:a_test (module 'empty')...ok [done in 0.007 s] =================================================== Test successful. $
  • 8. test _ `b a ^^ 1 empty:module_info(exports). [{a_test,0},{test,0},{module_info,0}, {module_info,1}] 2 empty:test(). Test passed. ok 3 eunit:test(empty). Test passed. ok 4 empty:a_test(). ok 5 eunit:test({empty,a_test}). Test passed. ok 6
  • 9. `a ERLC_FLAGS=-DNOTEST makefile ^ = `a c ^ Z # A simple Makefile ERLC_FLAGS=-DNOTEST ... `a a ca ^=” make release” ^ Z] release: clean $(MAKE) ERLC_FLAGS=$(ERLC_FLAGS) -DNOTEST
  • 10. `a a c $ make erlc -DNOTEST -o ebin/ src/empty.erl erl -noshell -pa ebin -eval 'eunit:test(ebin,[verbose])' -s init stop ====================== EUnit ====================== directory ebin module 'empty' [done in 0.004 s] There were no tests to run. $
  • 11. `a Z Z [ 1 empty:module_info(exports). [{module_info,0},{module_info,1}] 2 eunit:test(empty). There were no tests to run. ok 3
  • 12. _ca `a c cb c NOTEST c ^ = _ca `a %% : src/global.hrl -define(NOTEST, true). -include_lib(eunit/include/eunit.hrl). = TEST makefile ^ = NOTEST Z Z^ `a ^ makefile a ^ Z^ [=PZ ] Z[
  • 13. `a aV `a a [ eunit.hrl cc ` `Z EUnit ` Z ^ c ^[ `a EUnit = [ aZ ^ EUnit _ `b a 2 ] EUnit Z Z a c B = Z c Z Z ^
  • 14. `a Z %% : src/fib.erl -module(fib). -export([f/1]). -include(global.hrl). f(0) - 1; f(1) - 1; f(N) when N 1 - f(N-1) * f(N-2). f_test() - 1 = f(0), 1 = f(1), 2 = f(2).
  • 15. Badmatch Z = ====================== EUnit ====================== directory ebin fib: f_test (module 'fib')...*failed* ::error:{badmatch,1} in function fib:f_test/0 =================================================== Failed: 1. Skipped: 0. Passed: 0.
  • 16. `a Z ^ %% : src/fib.erl -module(fib). -export([f/1]). -include(global.hrl). f(0) - 1; f(1) - 1; f(N) when N 1 - f(N-1) * f(N-2). f0_test() - 1 = f(0). f1_test() - 1 = f(1). f2_test() - 2 = f(2).
  • 17. Z Z ] ====================== EUnit ====================== directory ebin module 'fib' fib: f0_test...ok fib: f1_test...ok fib: f2_test...*failed* ::error:{badmatch,1} in function fib:f2_test/0 [done in 0.024 s] =================================================== Failed: 1. Skipped: 0. Passed: 0.
  • 18. assert =H Z %% : src/fib.erl -module(fib). -export([f/1]). -include(global.hrl). f(0) - 1; f(1) - 1; f(N) when N 1 - f(N-1) * f(N-2). f0_test() - ?assertEqual(1, f(0)). f1_test() - ?assertEqual(1, f(1)). f2_test() - ?assertEqual(2, f(2)).
  • 19. ^ ^ ] ====================== EUnit ====================== directory ebin module 'fib' fib: f0_test...ok fib: f1_test...ok fib: f2_test...*failed* ::error:{assertEqual_failed,[{module,fib}, {line,14}, {expression,f ( 2 )}, {expected,2}, {value,1}]} in function fib:'-f2_test/0-fun-0-'/1
  • 20. ! assert %% File: src/fib.erl -module(fib). -export([f/1]). -include(global.hrl). f(0) - 1; f(1) - 1; f(N) when N 1 - f(N-1) * f(N-2). f_test() - ?assertEqual(1, f(0)), ?assertEqual(1, f(1)), ?assertEqual(2, f(2)), ?assertEqual(3, f(3)).
  • 21. *% ] ====================== EUnit ====================== directory ebin fib: f_test (module 'fib')...*failed* ::error:{assertEqual_failed,[{module,fib}, {line,13}, {expression,f ( 2 )}, {expected,2}, {value,1}]} in function fib:'-f_test/0-fun-2-'/1 in call from fib:f_test/0
  • 22. ` ac ^ %% : src/fib.erl -module(fib). -export([f/1]). -include(global.hrl). f(0) - 1; f(1) - 1; f(N) when N 1 - f(N-1) * f(N-2). f_test_() - [?_assertEqual(1, f(0)), ?_assertEqual(1, f(1)), ?_assertEqual(2, f(2)), ?_assertEqual(3, f(3))].
  • 23. ^[ `a` a ] fib:11: f_test_...ok fib:12: f_test_...ok fib:13: f_test_...*failed* ::error:{assertEqual_failed,[{module,fib}, {line,13}, {expression,f ( 2 )}, {expected,2}, {value,1}]} in function fib:'-f_test_/0-fun-4-'/1 fib:14: f_test_...*failed* ::error:{assertEqual_failed,[{module,fib}, {line,14}, {expression,f ( 3 )}, {expected,3}, {value,1}]} in function fib:'-f_test_/0-fun-6-'/1
  • 24. _c `a ` ^ %% : src/fib.erl -module(fib). -export([f/1]). -include(global.hrl). f(0) - 1; f(1) - 1; f(N) when N 1 - f(N-1) + f(N-2). f_test_() - [?_assertEqual(1, f(0)), ?_assertEqual(1, f(1)), ?_assertEqual(2, f(2)), ?_assertError(function_clause, f(-1)), ?_assert(f(31) =:= 2178309)].
  • 25. ]Z Z] [= S ====================== EUnit ====================== directory ebin module 'fib' fib:11: f_test_...ok fib:12: f_test_...ok fib:13: f_test_...ok fib:14: f_test_...ok fib:15: f_test_...[0.394 s] ok [done in 0.432 s] =================================================== All 5 tests passed.
  • 26. `a ` c ^ %% : src/fib_tests.erl -module(fib_tests). -include(global.hrl). f_test_() - [?_assertEqual(1, fib:f(0)), ?_assertEqual(1, fib:f(1)), ?_assertEqual(2, fib:f(2)), ?_assertError(function_clause, fib:f(-1)), ?_assert(fib:f(31) =:= 2178309)].
  • 27. ^] 1 eunit:test(fib, [verbose]). ====================== EUnit ====================== module 'fib' module 'fib_tests' fib_tests:6: f_test_...ok fib_tests:7: f_test_...ok fib_tests:8: f_test_...ok fib_tests:9: f_test_...ok fib_tests:11: f_test_...[0.405 s] ok [done in 0.442 s] [done in 0.442 s] =================================================== All 5 tests passed.
  • 28. c c` %% : src/fib.erl -module(fib). -export([f/1, g/1]). f(0) - 1; f(1) - 1; f(N) when N 1 - f(N-1) + f(N-2). g(N) when N = 0 - g(N, 0, 1). g(0, _F1, F2) - F2; g(N, F1, F2) - g(N - 1, F2, F1 + F2).
  • 29. U ^ `aZ %% : src/fib_tests.erl -module(fib_tests). -include(global.hrl). f_test_() - [...]. g_test_() - [?_assertError(function_clause, fib:g(-1)), ?_assertEqual(fib:f(0), fib:g(0)), ?_assertEqual(fib:f(1), fib:g(1)), ?_assertEqual(fib:f(2), fib:g(2)), ?_assertEqual(fib:f(17), fib:g(17)), ?_assertEqual(fib:f(31), fib:g(31))].
  • 30. YZ `a ] ====================== EUnit ====================== module 'fib' module 'fib_tests' fib_tests:6: f_test_...ok fib_tests:7: f_test_...ok fib_tests:8: f_test_...ok fib_tests:9: f_test_...ok fib_tests:11: f_test_...[0.397 s] ok fib_tests:14: g_test_...ok fib_tests:16: g_test_...ok fib_tests:17: g_test_...ok fib_tests:18: g_test_...ok fib_tests:19: g_test_...ok fib_tests:20: g_test_...[0.425 s] ok =================================================== All 11 tests passed.
  • 31. `a Z] Z %% : src/fib_tests.erl -module(fib_tests). -include(global.hrl). f_test_() - [...]. g_test_() - [?_assertEqual(fib:f(N), fib:g(N)) || N - lists:seq(0,33)]. g_error_test() - ?assertError(function_clause, fib:g(-1)).
  • 32. ZZZ ] Z fib_tests:17: g_test_...ok fib_tests:17: g_test_...ok ... fib_tests:17: g_test_...[0.001 s] ok fib_tests:17: g_test_...[0.002 s] ok fib_tests:17: g_test_...[0.003 s] ok fib_tests:17: g_test_...[0.005 s] ok fib_tests:17: g_test_...[0.008 s] ok fib_tests:17: g_test_...[0.013 s] ok fib_tests:17: g_test_...[0.021 s] ok ... fib_tests:17: g_test_...[0.566 s] ok fib_tests:17: g_test_...[0.939 s] ok [done in 3.148 s] =================================================== All 40 tests passed.
  • 33. `a Z ZZZ^ ^ Z] ^ ^][ *= ZZ^ ` _ ] a .( `c c`a= ]c`a=a ]c`a c [ `a ` Z Z [ ^ [[ = 2 ^
  • 34. c ?E ] %% : src/fib_tests.erl -module(fib_tests). -include(global.hrl). ... g_test_() - {inparallel, [?_assertEqual(fib:f(N), fib:g(N)) || N - lists:seq(0,33)] }. ...
  • 35. =] ] [ fib_tests:17: g_test_...ok fib_tests:17: g_test_...ok ... fib_tests:17: g_test_...[0.001 s] ok fib_tests:17: g_test_...ok fib_tests:17: g_test_...[0.003 s] ok fib_tests:17: g_test_...[0.011 s] ok fib_tests:17: g_test_...[0.015 s] ok fib_tests:17: g_test_...[0.023 s] ok fib_tests:17: g_test_...[0.036 s] ok ... fib_tests:17: g_test_...[1.378 s] ok fib_tests:17: g_test_...[1.085 s] ok [done in 1.853 s] =================================================== All 40 tests passed.
  • 36. - c`` %% : src/adder.erl -module(adder). -export([start/0, stop/1, add/2]). start() - spawn(fun server/0). stop(Pid) - Pid ! stop. add(D, Pid) - Pid ! {add, D, self()}, receive {adder, N} - N end. server() - server(0). server(N) - receive {add, D, From} - From ! {adder, N + D}, server(N + D); stop - ok end.
  • 37. n ` | %% : src/adder_tests.erl -module(adder_tests). -include(global.hrl). named_test_() - {setup, fun()- P=adder:start(), register(srv, P), P end, fun adder:stop/1, [?_assertEqual(0, adder:add(0, srv)), ?_assertEqual(1, adder:add(1, srv)), ?_assertEqual(11, adder:add(10, srv)), ?_assertEqual(6, adder:add(-5, srv)), ?_assertEqual(-5, adder:add(-11, srv)), ?_assertEqual(0, adder:add(-adder:add(0, srv), srv))] }.
  • 38. `a ` ` ... anonymous_test_() - {setup, fun adder:start/0, fun adder:stop/1, fun (Srv) - {inorder, %% [?_assertEqual(0, adder:add(0, Srv)), W U W ?_assertEqual(1, adder:add(1, Srv)), ?_assertEqual(11, adder:add(10, Srv)), ?_assertEqual(6, adder:add(-5, Srv)), ?_assertEqual(-5, adder:add(-11, Srv)), ?_assertEqual(0, adder:add(-adder:add(0, Srv), Srv))] } end}.
  • 39. Z Z assert - `a anonymous_test_() - {setup, fun adder:start/0, fun adder:stop/1, fun (Srv) - [?_test( begin ?assertEqual(0, adder:add(0, Srv)), ?assertEqual(1, adder:add(1, Srv)), ?assertEqual(11, adder:add(10, Srv)), ?assertEqual(6, adder:add(-5, Srv)), ?assertEqual(-5, adder:add(-11, Srv)), ?assertEqual(0, adder:add(-adder:add(0, Srv), Srv)) end)] end}.
  • 40. `a b 8 anonymous_test_() - {setup, fun adder:start/0, fun adder:stop/1, fun (Srv) - [?_test( begin assert_add( 0, 0, Srv), ... assert_add(-11, -5, Srv), assert_add(-adder:add(0, Srv), 0, Srv) end )] end}. assert_add(D, N, Srv) - ?assertEqual(N, adder:add(D, Srv)).
  • 41. `a F anonymous_test_() - {setup, fun adder:start/0, fun adder:stop/1, fun (Srv) - {with, Srv, [fun first_subtest/1, ...] } end}. first_subtest(Srv) - assert_add( 0, 0, Srv), ... assert_add(-11, -5, Srv), assert_add(-adder:add(0, Srv), 0, Srv). assert_add(D, N, Srv) - ?assertEqual(N, adder:add(D, Srv)).
  • 42. 'with' ' [ ` a anonymous_test_() - {setup, fun adder:start/0, fun adder:stop/1, {with, [fun first_subtest/1, ...] } }. first_subtest(Srv) - assert_add( 0, 0, Srv), ... assert_add(-11, -5, Srv), assert_add(-adder:add(0, Srv), 0, Srv). assert_add(D, N, Srv) - ?assertEqual(N, adder:add(D, Srv)).
  • 43. `a a Z y [ `a a a Y a ! [ ' ^ [ `a a c c [ (UODQJ Z ^ ^ ^^ S F S a -ifdef(TEST) c (8QLW a c S ^ [Z - ]
  • 44. 2.1 EUNIT ` ( “[verbose]”) A cb a ` 9Z a [ cb a _ a[ ` c Maven (“surefire”) b a `a` a ac ` ZZ[^ ^` ac Z ^ [ ^[ ' 8 [
  • 45. ] Z