SlideShare ist ein Scribd-Unternehmen logo
1 von 45
Downloaden Sie, um offline zu lesen
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

Weitere ähnliche Inhalte

Was ist angesagt?

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
 

Was ist angesagt? (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
 

Andere mochten auch

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
 

Andere mochten auch (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
 

Ähnlich wie 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
 

Ähnlich wie 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
 

Mehr von 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
 

Mehr von 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に貢献する方法
 
儲かるドキュメント
儲かるドキュメント儲かるドキュメント
儲かるドキュメント
 

Kürzlich hochgeladen

From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Igalia
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)wesley chun
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Enterprise Knowledge
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CVKhem
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?Antenna Manufacturer Coco
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 

Kürzlich hochgeladen (20)

From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 

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