SlideShare une entreprise Scribd logo
1  sur  69
Télécharger pour lire hors ligne
Introduction
                                 Case study
                               Methodology
                                Conclusions




                  Improving software development using
                              Erlang/OTP
                                   a case study

                             Laura M. Castro Souto


                         MADS Group  Universidade da Coruña


                                 June 10th, 2010




Laura M. Castro                                  Improving sw. development with Erlang/OTP  1 of 46
Introduction
                                      Case study
                                    Methodology
                                     Conclusions

 Outline




      1    Introduction


      2    Case study


      3    Functional software development methodology
                  From requirements to analysis and design
                  Implementation of a paradigm shift
                  Ensuring functionality and quality through testing


      4    Conclusions




Laura M. Castro                                     Improving sw. development with Erlang/OTP  2 of 46
Introduction
                                      Case study
                                    Methodology
                                     Conclusions




      1    Introduction


      2    Case study


      3    Functional software development methodology
                  From requirements to analysis and design
                  Implementation of a paradigm shift
                  Ensuring functionality and quality through testing


      4    Conclusions




Laura M. Castro                                     Improving sw. development with Erlang/OTP  3 of 46
Introduction
                                   Case study
                                 Methodology
                                  Conclusions

 The questions




              How can we build   better software. . .
                  when the domain is extremely complex?
                  when a lot of expert knowledge is required?
                  when we want robust, distributed, fault-tolerant systems?
                  when we look for versatile, exible, adaptable applications?




Laura M. Castro                                   Improving sw. development with Erlang/OTP  4 of 46
Introduction
                                   Case study
                                 Methodology
                                  Conclusions

 The questions




              How can we build   better software. . .
                  when the domain is extremely complex?
                  when a lot of expert knowledge is required?
                  when we want robust, distributed, fault-tolerant systems?
                  when we look for versatile, exible, adaptable applications?

                                                . . . using   functional technology?


Laura M. Castro                                         Improving sw. development with Erlang/OTP  4 of 46
Introduction
                                    Case study
                                  Methodology
                                   Conclusions

 Our answer



      A   declarative paradigm-based software development methodology
            can achieve   signicant improvement by means of quality
                                  assurance methods

      A declarative approximation is:


              more   suitable to address and solve real-world problems
              compatible with traditional analysis and design techniques
              powerful to improve product quality

Laura M. Castro                                  Improving sw. development with Erlang/OTP  5 of 46
Introduction
                                      Case study
                                    Methodology
                                     Conclusions




      1    Introduction



      2    Case study



      3    Functional software development methodology
                  From requirements to analysis and design
                  Implementation of a paradigm shift
                  Ensuring functionality and quality through testing



      4    Conclusions




Laura M. Castro                                     Improving sw. development with Erlang/OTP  6 of 46
Introduction
                                     Case study
                                   Methodology
                                    Conclusions

 Case study


 Advanced Risk Management Information System:
 Tracking Insurances, Claims, and Exposures


              A   complex management application for a prominent eld
              At the time (2002),   no alternatives from clients' perspective
                    Today, still no comparable product in the market

              Specic and risky, client company did not have a R  D


                    Agreement with research group at local University


Laura M. Castro                                     Improving sw. development with Erlang/OTP  7 of 46
Introduction
                                   Case study
                                 Methodology
                                  Conclusions

 Project requirements




              Modelling and management of organisation resources


              Modelling and management of potential risks


              Modelling and management of contracted insurance policies


                  Including modelling and management of policy clauses

              Management of claims for accidents


                  Selection of the most suitable warranty
                  (help decision support system)


Laura M. Castro                                    Improving sw. development with Erlang/OTP  8 of 46
Introduction
                                    Case study
                                  Methodology
                                   Conclusions

 Project information


              Client-server architecture

                  Multiplatform lightweight Java client
                  Server completely developed using Erlang/OTP
              Started in 2002, rst on-site deployment in 2005

                  Under maintenance since 2008

              Development took around 200 person-months

                  Up to ve developers (three of them full-time)

              Maintenance nowadays takes around 500 person-hours/year


              Total code size (server + client)   ∼ (83000 + 66000)             LOC

Laura M. Castro                                    Improving sw. development with Erlang/OTP  9 of 46
Introduction
                                                   From requirements to analysis and design
                                      Case study
                                                   Implementation of a paradigm shift
                                    Methodology
                                                   Ensuring functionality and quality through testing
                                     Conclusions




      1    Introduction



      2    Case study



      3    Functional software development methodology
                  From requirements to analysis and design
                  Implementation of a paradigm shift
                  Ensuring functionality and quality through testing



      4    Conclusions




Laura M. Castro                                          Improving sw. development with Erlang/OTP  10 of 46
Introduction
                                                   From requirements to analysis and design
                                     Case study
                                                   Implementation of a paradigm shift
                                   Methodology
                                                   Ensuring functionality and quality through testing
                                    Conclusions

 From requirements to analysis and design




      Requirements elicitation:

           Risk situations have a number of specic properties, which may
                                     vary with time.


              Implication of   experts is essential
              Structured and unstructured         interviews provide good results
              Multidisciplinary teams are more productive


Laura M. Castro                                          Improving sw. development with Erlang/OTP  11 of 46
Introduction
                                                 From requirements to analysis and design
                                    Case study
                                                 Implementation of a paradigm shift
                                  Methodology
                                                 Ensuring functionality and quality through testing
                                   Conclusions

 From requirements to analysis and design




              O.O. analysis and   standard UML favour communication
              Design patterns help to avoid known pitfalls
                                                                                REAL DATA




Laura M. Castro                                        Improving sw. development with Erlang/OTP  12 of 46
Introduction
                                                 From requirements to analysis and design
                                    Case study
                                                 Implementation of a paradigm shift
                                  Methodology
                                                 Ensuring functionality and quality through testing
                                   Conclusions

 From requirements to analysis and design




              O.O. analysis and   standard UML favour communication
              Design patterns help to avoid known pitfalls
              Model formalisation as declarative statements
                  Provides early validation
                  Close to functional implementation, re-usable for testing
                  Valuable for traceability



Laura M. Castro                                        Improving sw. development with Erlang/OTP  12 of 46
Introduction
                                                 From requirements to analysis and design
                                    Case study
                                                 Implementation of a paradigm shift
                                  Methodology
                                                 Ensuring functionality and quality through testing
                                   Conclusions

 Implementation of a paradigm shift




      Functionality implementation:

            Determination of policy relevance in the event of an accident.


          1    No conict between object-oriented analysis and design,
               and implementation approach


          2    High-level algorithm description eases the implementation
               task,   improving eciency


Laura M. Castro                                        Improving sw. development with Erlang/OTP  13 of 46
Introduction
                                                  From requirements to analysis and design
                                     Case study
                                                  Implementation of a paradigm shift
                                   Methodology
                                                  Ensuring functionality and quality through testing
                                    Conclusions

 Object orientation vs. declarative paradigm


      The     object-oriented perspective:
              is   closer to the way we perceive real entities
              does   not perform well when describing behavioural details
              grants   stability of actors and interfaces

      The     declarative perspective:
              is   closer to the way we specify tasks and activities
              does   not work comfortably at the big scale of things
              provides   expressive ways of implementing algorithms

Laura M. Castro                                         Improving sw. development with Erlang/OTP  14 of 46
Introduction
                                              From requirements to analysis and design
                                 Case study
                                              Implementation of a paradigm shift
                               Methodology
                                              Ensuring functionality and quality through testing
                                Conclusions

 Objects in Erlang/OTP



      Objects as   data structures




      Objects as   processes




Laura M. Castro                                     Improving sw. development with Erlang/OTP  15 of 46
Introduction
                                              From requirements to analysis and design
                                 Case study
                                              Implementation of a paradigm shift
                               Methodology
                                              Ensuring functionality and quality through testing
                                Conclusions

 Objects in Erlang/OTP


                                                                simple
      Objects as   data structures
                                                                immutable


                                                                coarse grain concurrency



      Objects as   processes                                    low resource usage




Laura M. Castro                                     Improving sw. development with Erlang/OTP  15 of 46
Introduction
                                              From requirements to analysis and design
                                 Case study
                                              Implementation of a paradigm shift
                               Methodology
                                              Ensuring functionality and quality through testing
                                Conclusions

 Objects in Erlang/OTP


                                                                 secure encapsulation
      Objects as   data structures
                                                                 `mutable'


                                                                 ne grain concurrency



      Objects as   processes                                     more resource consuming




Laura M. Castro                                     Improving sw. development with Erlang/OTP  15 of 46
Introduction
                                                  From requirements to analysis and design
                                     Case study
                                                  Implementation of a paradigm shift
                                   Methodology
                                                  Ensuring functionality and quality through testing
                                    Conclusions

 Objects in Erlang/OTP



      Objects as     data structures for short life, coarse concurrency
              business objects (risk objects, risk groups, risks, policies,
              accidents,. . . ), data types, etc.

      Objects as     processes for long life, ne-grain concurrency
              data storage connection pool, user session manager, task
              server, le logger, conguration server, etc.


      Both are conveniently used in our study case ARMISTICE.

Laura M. Castro                                         Improving sw. development with Erlang/OTP  15 of 46
Introduction
                                                 From requirements to analysis and design
                                    Case study
                                                 Implementation of a paradigm shift
                                  Methodology
                                                 Ensuring functionality and quality through testing
                                   Conclusions

 Implementation of real-world behaviour




            Determination of policy relevance in the event of an accident.


      In Erlang syntax:



        Restriction =       {hazard, Hazard}
                    |       {formula, {Name, Value}}
                    |       {string, Nuance}
                    |       {all, [Restriction]}
                    |       {any, [Restriction]}                       | ...




Laura M. Castro                                        Improving sw. development with Erlang/OTP  16 of 46
Introduction
                                         From requirements to analysis and design
                            Case study
                                         Implementation of a paradigm shift
                          Methodology
                                         Ensuring functionality and quality through testing
                           Conclusions

 Implementation of real-world behaviour



      relevant_policy(Hazard, PolicyClauses) -
        [ Clause || Clause - PolicyClauses,
                    relevant(Hazard, Clause) =/= false ].



      relevant(H, {hazard, H})      -         true;
      relevant(H, {hazard, NH})     -         false;
      relevant(H, {string, Nuance}) -         Nuance;
      relevant(H, {all, Clauses})   -
              lists:foldl(fun(A, B) -         and(A, B) end, true,
                         [ relevant(H,         C) || C - Clauses ]);
      relevant(H, {any, Clauses})   -
              lists:foldl(fun(A, B) -         or(A, B) end, false,
                         [ relevant(H,         C) || C - Clauses ]);
      ...


Laura M. Castro                                Improving sw. development with Erlang/OTP  17 of 46
Introduction
                                                  From requirements to analysis and design
                                     Case study
                                                  Implementation of a paradigm shift
                                   Methodology
                                                  Ensuring functionality and quality through testing
                                    Conclusions

 Ensuring functionality and quality through testing



      Testing

                        There is a problem with ARMISTICE. . . 

      Three types of       testing scenarios (in theory):
          1   Conformance of components to specication (                   unit testing)
          2   Appropriate interaction of components (             integration testing)
          3   System behaviour in accordance with requirements (                       validation)


Laura M. Castro                                         Improving sw. development with Erlang/OTP  18 of 46
Introduction
                                                  From requirements to analysis and design
                                     Case study
                                                  Implementation of a paradigm shift
                                   Methodology
                                                  Ensuring functionality and quality through testing
                                    Conclusions

 Ensuring functionality and quality through testing



      Testing

                        There is a problem with ARMISTICE. . . 

      Three types of       testing scenarios (in the real world):
          1   By-hand developer ad-hoc tests on own code
          2   By-hand developer functionality testing
          3   On-site user validation


Laura M. Castro                                         Improving sw. development with Erlang/OTP  18 of 46
Introduction
                                                 From requirements to analysis and design
                                    Case study
                                                 Implementation of a paradigm shift
                                  Methodology
                                                 Ensuring functionality and quality through testing
                                   Conclusions

 Unit testing of data types using properties



      Unit testing

          Does the decimal custom data type conform to its specication? 

      Sometimes a      custom implementation of a data type is in place
      (i.e., ARMISTICE currency data type)


              Requirement :   support for multiple currencies, exchange rates


              Requirement :   16 decimal digits precision


              Technical requirement :    uniform marshalling/unmarshalling



Laura M. Castro                                        Improving sw. development with Erlang/OTP  19 of 46
Introduction
                                                                             From requirements to analysis and design
                                                             Case study
                                                                             Implementation of a paradigm shift
                                                           Methodology
                                                                             Ensuring functionality and quality through testing
                                                            Conclusions

 Unit testing of data types using properties



                                new                                        Initial strategy:

              single-value                  tuple-value
                                                                               Use an automatic testing tool


                                                                                    generate random decimal
                                      integer-part        decimal-part
                                                                               to

        int    float   string         int       string    nat     string
                                                                               values:        QuickCheck




      decimal() -
        ?LET(Tuple, {int(), nat()}, decimal:new(Tuple)).




Laura M. Castro                                                                     Improving sw. development with Erlang/OTP  20 of 46
Introduction
                                           From requirements to analysis and design
                              Case study
                                           Implementation of a paradigm shift
                            Methodology
                                           Ensuring functionality and quality through testing
                             Conclusions

 Unit testing of data types using properties




      prop_sum_comm() -
        ?FORALL({D1, D2}, {decimal(), decimal()},
                decimal:sum(D1, D2) == decimal:sum(D2, D1)).



      Thousands of randomly generated      test cases will pass for this
      kind of properties




Laura M. Castro                                  Improving sw. development with Erlang/OTP  21 of 46
Introduction
                                               From requirements to analysis and design
                                  Case study
                                               Implementation of a paradigm shift
                                Methodology
                                               Ensuring functionality and quality through testing
                                 Conclusions

 Unit testing of data types using properties




      prop_sum_comm() -
        ?FORALL({D1, D2}, {decimal(), decimal()},
                decimal:sum(D1, D2) == decimal:sum(D2, D1)).



      Thousands of randomly generated          test cases will pass for this
      kind of properties but. . .


              which other properties do we add?
              when do we have suciently many of them?

Laura M. Castro                                      Improving sw. development with Erlang/OTP  21 of 46
Introduction
                                                From requirements to analysis and design
                                   Case study
                                                Implementation of a paradigm shift
                                 Methodology
                                                Ensuring functionality and quality through testing
                                  Conclusions

 Unit testing of data types using properties


      Dene a     model for the data type:

                           [sum(di , dj )]   ≡       [di ] + [dj ]
                          [subs (di , dj )]  ≡       [di ] − [dj ]
                          [mult (di , dj )] ≡        [di ] ∗ [dj ]
                           [divs (di , dj )] ≡       [di ] / [dj ]
                                             ...


          decimal_model(Decimal) - decimal:get_value(Decimal).


      Erlang/C oating point implementation (IEEE 754-1985 standard)



Laura M. Castro                                       Improving sw. development with Erlang/OTP  22 of 46
Introduction
                                         From requirements to analysis and design
                            Case study
                                         Implementation of a paradigm shift
                          Methodology
                                         Ensuring functionality and quality through testing
                           Conclusions

 Unit testing of data types using properties




      prop_sum() -
        ?FORALL({D1, D2}, {decimal(), decimal()},
          decimal_model(decimal:sum(D1, D2)) ==
             decimal_model(D1) + decimal_model(D2)).




Laura M. Castro                                Improving sw. development with Erlang/OTP  23 of 46
Introduction
                                              From requirements to analysis and design
                                 Case study
                                              Implementation of a paradigm shift
                               Methodology
                                              Ensuring functionality and quality through testing
                                Conclusions

 Unit testing of data types using properties




      prop_sum() -
        ?FORALL({D1, D2}, {decimal(), decimal()},
          decimal_model(decimal:sum(D1, D2)) ==
             decimal_model(D1) + decimal_model(D2)).


      Problem:    errors show internal representation



       eqc:quickcheck(decimal_eqc:prop_sum()).
      ....Failed! After 5 tests.
      {{decimal,1000000000000000}, {decimal,11000000000000000}}
      false




Laura M. Castro                                     Improving sw. development with Erlang/OTP  23 of 46
Introduction
                                              From requirements to analysis and design
                                 Case study
                                              Implementation of a paradigm shift
                               Methodology
                                              Ensuring functionality and quality through testing
                                Conclusions

 Unit testing of data types using properties


      Use    symbolic data structures in test generation:

      decimal() -
        ?LET(Tuple, {int(),nat()}, {call,decimal,new,[Tuple]}).

      prop_sum() -
        ?FORALL({SD1, SD2}, {decimal(), decimal()},
           begin
             D1 = eval(SD1),
             D2 = eval(SD2),
             decimal_model(decimal:sum(D1, D2)) ==
                           decimal_model(D1) + decimal_model(D2)
           end).




Laura M. Castro                                     Improving sw. development with Erlang/OTP  24 of 46
Introduction
                                             From requirements to analysis and design
                                Case study
                                             Implementation of a paradigm shift
                              Methodology
                                             Ensuring functionality and quality through testing
                               Conclusions

 Unit testing of data types using properties



      Errors reported with symbolic values are easier to understand:



       eqc:quickcheck(decimal_eqc:prop_sum()).
      ........Failed! After 9 tests.
      {{call,decimal,new,[2,1]}, {call,decimal,new,[2,2]}}
      Shrinking..(2 times)
      {{call,decimal,new,[0,1]}, {call,decimal,new,[0,2]}}
      false


                               0. 1   + 0. 2 = 0. 3   ?


      Indeed, due to unavoidable IEEE 754-1985 rounding problem.




Laura M. Castro                                    Improving sw. development with Erlang/OTP  25 of 46
Introduction
                                              From requirements to analysis and design
                              Case study
                                              Implementation of a paradigm shift
                            Methodology
                                              Ensuring functionality and quality through testing
                             Conclusions

 Unit testing of data types using properties

      Adjust the model:

                  |a| − |b |      abs
                   x −y
      a≈b⇔                        rel , x   = max(|a|, |b |), y = min(|a|, |b |)
                     x
                                  abs      = 10−16 ,     rel   = 10−10


      prop_sum() -
        ?FORALL({SD1, SD2}, {decimal(), decimal()},
           begin
             D1 = eval(SD1),
             D2 = eval(SD2),
             equivalent(decimal_model(decimal:sum(D1, D2)),
                        decimal_model(D1) + decimal_model(D2))
           end).

Laura M. Castro                                     Improving sw. development with Erlang/OTP  26 of 46
Introduction
                                                    From requirements to analysis and design
                                       Case study
                                                    Implementation of a paradigm shift
                                     Methodology
                                                    Ensuring functionality and quality through testing
                                      Conclusions

 Unit testing of data types using properties


      Beware we may feel satised with this unit testing but:


              It is   not exhaustive
                      We have not tested all possibilities for decimal:new/1

              It is   not complete                                                                    decimal
                                                                                                                      ...

                      We have not tested operations
                                                                          new                             sum        mult
                      combination
                                                          single-value                tuple-value


                                                                                integer-part        decimal-part



                                                    int      float   string     int       string    nat     string




Laura M. Castro                                                Improving sw. development with Erlang/OTP  27 of 46
Introduction
                                              From requirements to analysis and design
                                 Case study
                                              Implementation of a paradigm shift
                               Methodology
                                              Ensuring functionality and quality through testing
                                Conclusions

 Unit testing of data types using properties

      Introduce   recursive generators including `generator' operations:

      decimal() -
        ?SIZED(Size, decimal(Size)).

      decimal(0) -
        {call,decimal,new,[oneof([int(), real(), dec_string(),
                                 {oneof([int(), list(digit())]),
                                  oneof([nat(), list(digit())])}
                                  ])]};
      decimal(Size) -
        Smaller = decimal(Size div 2),
        oneof([decimal(0),
               {call, decimal, sum, [Smaller,Smaller]},
               {call, decimal, mult,[Smaller,Smaller]}, ...]).


Laura M. Castro                                     Improving sw. development with Erlang/OTP  28 of 46
Introduction
                                           From requirements to analysis and design
                              Case study
                                           Implementation of a paradigm shift
                            Methodology
                                           Ensuring functionality and quality through testing
                             Conclusions

 Unit testing of data types using properties




      Shrinking customisation can improve counterexample quality:

      decimal(Size) -
        Smaller = decimal(Size div 2),
        oneof([decimal(0),
          ?LETSHRINK([D1, D2], [Smaller, Smaller],
                     {call, decimal, sum, [D1, D2]}),
          ?LETSHRINK([D1, D2], [Smaller, Smaller],
                     {call, decimal, mult, [D1, D2]}), ...]).




Laura M. Castro                                  Improving sw. development with Erlang/OTP  29 of 46
Introduction
                                                From requirements to analysis and design
                                   Case study
                                                Implementation of a paradigm shift
                                 Methodology
                                                Ensuring functionality and quality through testing
                                  Conclusions

 Unit testing of data types using properties

      Error scenarios (   negative testing) must be checked at properties:
      prop_divs() -
       ?FORALL({SD1, SD2}, {decimal(), decimal()},
          begin
            D1 = eval(SD1),
            D2 = eval(SD2),
            case equivalent(decimal_model(D2), 0.0) of
              true -
                {’EXIT’,_} = catch (decimal_model(D1)/
                                             decimal_model(D2)),
                {error, _} = decimal:divs(D1, D2);
              false -
                equivalent(decimal_model(decimal:divs(D1, D2)),
                            decimal_model(D1)/decimal_model(D2))
            end
          end).

Laura M. Castro                                       Improving sw. development with Erlang/OTP  30 of 46
Introduction
                                             From requirements to analysis and design
                                Case study
                                             Implementation of a paradigm shift
                              Methodology
                                             Ensuring functionality and quality through testing
                               Conclusions

 Unit testing of data types using properties

      Generator must be   well-dened, with additional base case test:

      defined(E) -
        case catch eval(E) of
          {’EXIT’, _} - false
          _Value      - true;
        end.

      well_defined(G) -
         ?SUCHTHAT(E, G, defined(E)).

      decimal() -
        ?SIZED(Size, well_defined(decimal(Size))).

      prop_new() -
        ?FORALL(SD,decimal(0),is_float(decimal_model(eval(SD)))).


Laura M. Castro                                    Improving sw. development with Erlang/OTP  31 of 46
Introduction
                                                  From requirements to analysis and design
                                     Case study
                                                  Implementation of a paradigm shift
                                   Methodology
                                                  Ensuring functionality and quality through testing
                                    Conclusions

 Unit testing of data types using properties




      Methodology to     guarantee full testing:
          1   Denition of a   suitable model for the data type
          2   Generation of    well-dened, symbolic values
                  including all productive operations
          3   Denition of one   property for each operation
                  considering expected failing cases

          4   Fine-tuning of shrinking preferences

Laura M. Castro                                         Improving sw. development with Erlang/OTP  32 of 46
Introduction
                                                   From requirements to analysis and design
                                      Case study
                                                   Implementation of a paradigm shift
                                    Methodology
                                                   Ensuring functionality and quality through testing
                                     Conclusions

 State machine-based integration testing



      Integration testing

               Do the appropriate components interact as expected when
                               creating a new risk group? 


                Software is usually structured in dierent            components
                Must be   tested on their own to ensure they perform correctly,
                in combination to ensure they interact properly
                Components treated as working         black boxes

Laura M. Castro                                          Improving sw. development with Erlang/OTP  33 of 46
Introduction
                                                 From requirements to analysis and design
                                    Case study
                                                 Implementation of a paradigm shift
                                  Methodology
                                                 Ensuring functionality and quality through testing
                                   Conclusions

 QuickCheck state machine testing




         Load information about the system:


           user sessions, risk groups identiers,
           risk objects identiers, etc.




Laura M. Castro                                        Improving sw. development with Erlang/OTP  34 of 46
Introduction
                                        From requirements to analysis and design
                           Case study
                                        Implementation of a paradigm shift
                         Methodology
                                        Ensuring functionality and quality through testing
                          Conclusions

 QuickCheck state machine testing




   -record(state, {user_sessions,
                   groups,
                   objects}).

   initial_state()-
     #state{user_sessions = [],
            groups        = [],
            objects       = []}.




Laura M. Castro                               Improving sw. development with Erlang/OTP  34 of 46
Introduction
                                                  From requirements to analysis and design
                                     Case study
                                                  Implementation of a paradigm shift
                                   Methodology
                                                  Ensuring functionality and quality through testing
                                    Conclusions

 QuickCheck state machine testing




           Pick one of possible service


           invocations


           Use    frequency   to specify


           probabilities


           Introduce `anomalies' (i.e., delays)




Laura M. Castro                                         Improving sw. development with Erlang/OTP  34 of 46
Introduction
                                        From requirements to analysis and design
                           Case study
                                        Implementation of a paradigm shift
                         Methodology
                                        Ensuring functionality and quality through testing
                          Conclusions

 QuickCheck state machine testing




   command(S) -
     frequency(
        ...
        [{7,{call, risk_group_facade,
            new_risk_group,
           [oneof(S#state.user_sessions),
            group_name()]}}
        || S#state.user_sessions =/= []],
        ...
     ).




Laura M. Castro                               Improving sw. development with Erlang/OTP  34 of 46
Introduction
                                               From requirements to analysis and design
                                  Case study
                                               Implementation of a paradigm shift
                                Methodology
                                               Ensuring functionality and quality through testing
                                 Conclusions

 QuickCheck state machine testing




           Check whether current status allows


   invocation of chosen service:


           no previous conditions required to
           create a new risk group




Laura M. Castro                                      Improving sw. development with Erlang/OTP  34 of 46
Introduction
                                        From requirements to analysis and design
                           Case study
                                        Implementation of a paradigm shift
                         Methodology
                                        Ensuring functionality and quality through testing
                          Conclusions

 QuickCheck state machine testing




   precondition(S,
               {call,risk_group_facade,
                new_risk_group,
               [SessionID, Name]})-
     true;




Laura M. Castro                               Improving sw. development with Erlang/OTP  34 of 46
Introduction
                                               From requirements to analysis and design
                                  Case study
                                               Implementation of a paradigm shift
                                Methodology
                                               Ensuring functionality and quality through testing
                                 Conclusions

 QuickCheck state machine testing




              Service invocation execution may


   aect the test state:


           a new risk group identier is added




Laura M. Castro                                      Improving sw. development with Erlang/OTP  34 of 46
Introduction
                                        From requirements to analysis and design
                           Case study
                                        Implementation of a paradigm shift
                         Methodology
                                        Ensuring functionality and quality through testing
                          Conclusions

 QuickCheck state machine testing




   next_state(S, Value,
              {call,risk_group_facade,
               new_risk_group,
               Arguments}) -
     S#state{groups =
            [ Value | S#state.groups ]};




Laura M. Castro                               Improving sw. development with Erlang/OTP  34 of 46
Introduction
                                               From requirements to analysis and design
                                  Case study
                                               Implementation of a paradigm shift
                                Methodology
                                               Ensuring functionality and quality through testing
                                 Conclusions

 QuickCheck state machine testing




             Check properties the system must


   hold after service execution:


           no previous conditions required to
           create a new risk group




Laura M. Castro                                      Improving sw. development with Erlang/OTP  34 of 46
Introduction
                                        From requirements to analysis and design
                           Case study
                                        Implementation of a paradigm shift
                         Methodology
                                        Ensuring functionality and quality through testing
                          Conclusions

 QuickCheck state machine testing




   postcondition(S,
                {call,risk_group_facade,
                 new_risk_group,
                 Arguments}, Result)-
     true;




Laura M. Castro                               Improving sw. development with Erlang/OTP  34 of 46
Introduction
                                                      From requirements to analysis and design
                                    Case study
                                                      Implementation of a paradigm shift
                                  Methodology
                                                      Ensuring functionality and quality through testing
                                   Conclusions

 QuickCheck state machine testing




           QuickCheck shrinks the failing test


           case to the   shortest sequence       of


           commands which invocation leads to


           the same error




Laura M. Castro                                             Improving sw. development with Erlang/OTP  34 of 46
Introduction
                                                From requirements to analysis and design
                                   Case study
                                                Implementation of a paradigm shift
                                 Methodology
                                                Ensuring functionality and quality through testing
                                  Conclusions

 QuickCheck state machine testing




           Proceed to next test case, or


           Exit reporting test pass




Laura M. Castro                                       Improving sw. development with Erlang/OTP  34 of 46
Introduction
                                                 From requirements to analysis and design
                                    Case study
                                                 Implementation of a paradigm shift
                                  Methodology
                                                 Ensuring functionality and quality through testing
                                   Conclusions

 QuickCheck state machine-based integration testing


      Integration test success:




Laura M. Castro                                        Improving sw. development with Erlang/OTP  35 of 46
Introduction
                                             From requirements to analysis and design
                                Case study
                                             Implementation of a paradigm shift
                              Methodology
                                             Ensuring functionality and quality through testing
                               Conclusions

 QuickCheck state machine-based integration testing


      Integration test success: verication of expected function calls
      (   dummy component)



                                                                 Reduced eort
                                                                 Collateral eects
                                                                 avoidance
                                                                 Early-stage problems
                                                                 detection




Laura M. Castro                                    Improving sw. development with Erlang/OTP  35 of 46
Introduction
                                             From requirements to analysis and design
                                Case study
                                             Implementation of a paradigm shift
                              Methodology
                                             Ensuring functionality and quality through testing
                               Conclusions

 QuickCheck state machine-based integration testing


      Original source code:

      new_risk_group(SessionID, GroupName, GroupDescription)-
        {ok, GroupData} =
              risk_group_dao:new_skeleton(SessionID),
        [{oid,GroupID}, {code,GroupCode},
         {name,DefName},{desc,EmptyDescription}] = GroupData,
        ok = risk_group_dao:update(SessionID, GroupID,
                                      GroupName,
                                      GroupDescription),
        ok = risk_group_dao:unlock(SessionID, GroupID),
        {ok, [{oid, GroupID}, {code, GroupCode},
              {name, GroupName}, {desc, GroupDescription}]}.




Laura M. Castro                                    Improving sw. development with Erlang/OTP  36 of 46
Introduction
                                         From requirements to analysis and design
                            Case study
                                         Implementation of a paradigm shift
                          Methodology
                                         Ensuring functionality and quality through testing
                           Conclusions

 QuickCheck state machine-based integration testing


      Dummy component source code:

      new_risk_group(SessionID, GroupName, GroupDescription)-
        GroupData = [{oid,group_id()}, {code,group_code()},
                     {name,GroupName}, {desc,GroupDescription}],
        op_logger:add({risk_group_dao, new_skeleton,
                      [SessionID], {ok, GroupData}}),
        op_logger:add({risk_group_dao, update,
                      [SessionID, GroupID, GroupCode,
                       GroupName, GroupDescription], ok}),
        op_logger:add({risk_group_dao, unlock,
                      [SessionID, GroupID], ok}),
        {ok, GroupData}.




Laura M. Castro                                Improving sw. development with Erlang/OTP  36 of 46
Introduction
                                              From requirements to analysis and design
                                 Case study
                                              Implementation of a paradigm shift
                               Methodology
                                              Ensuring functionality and quality through testing
                                Conclusions

 QuickCheck state machine-based integration testing


      Testing state machine   postcondition and property:

      postcondition(S, {call,risk_group_facade,
                        new_risk_group,Arguments}, Result)-
        Operations = op_logger:get({new_risk_group}),
        check(new_risk_group, {S,Arguments,Operations,Result});

      prop_integration() -
        ?FORALL(Commands, commands(?MODULE),
          begin
            {History,S,Result} = run_commands(?MODULE,Commands),
            Result == ok
          end).




Laura M. Castro                                     Improving sw. development with Erlang/OTP  37 of 46
Introduction
                                                From requirements to analysis and design
                                   Case study
                                                Implementation of a paradigm shift
                                 Methodology
                                                Ensuring functionality and quality through testing
                                  Conclusions

 QuickCheck state machine-based integration testing



      Methodology to fully    test component integration:
              Internal state stores minimal information for test
              generation


              Transitions are operations to be tested
              Interactions are performed against       dummy objects
              Preconditions are true, postconditions check correct
              sequence of interactions



Laura M. Castro                                       Improving sw. development with Erlang/OTP  38 of 46
Introduction
                                                   From requirements to analysis and design
                                      Case study
                                                   Implementation of a paradigm shift
                                    Methodology
                                                   Ensuring functionality and quality through testing
                                     Conclusions

 Data integrity validation via business rules testing


      Validation

             Does the system enforce that there is only one policy renewal
                             under construction at a time? 


               Complex,   data-intensive software usually handles great
               number of business objects with complex relationships
               Few basic data consistency constraints are enforced by
               storage media (i.e., DBMS)
                    Too complex, change dynamically, non-trivial calculations,. . .

Laura M. Castro                                          Improving sw. development with Erlang/OTP  39 of 46
Introduction
                                                          From requirements to analysis and design
                                             Case study
                                                          Implementation of a paradigm shift
                                           Methodology
                                                          Ensuring functionality and quality through testing
                                            Conclusions

 Data integrity validation via business rules testing



      Ensure that        business rules are respected at all times:
                  APPLICATION INTERFACE




              APPLICATION BUSINESS LOGIC
                                                                  Sequences of interface calls
                                                                  could violate them

                         RDBMS
                                                                  Unit testing is           not enough



Laura M. Castro                                                 Improving sw. development with Erlang/OTP  40 of 46
Introduction
                                                                   From requirements to analysis and design
                                                      Case study
                                                                   Implementation of a paradigm shift
                                                    Methodology
                                                                   Ensuring functionality and quality through testing
                                                     Conclusions

 Data integrity validation via business rules testing



      Ensure that                 business rules are respected at all times:
                              t
                           in
                         po
                     s      APPLICATION INTERFACE
              c   es
         ac




                     APPLICATION BUSINESS LOGIC
                                                                           Sequences of interface calls
                                                                           could violate them

                   ed
          tru
                st                RDBMS
                                                                           Unit testing is           not enough



Laura M. Castro                                                          Improving sw. development with Erlang/OTP  40 of 46
Introduction
                                                          From requirements to analysis and design
                                             Case study
                                                          Implementation of a paradigm shift
                                           Methodology
                                                          Ensuring functionality and quality through testing
                                            Conclusions

 Data integrity validation via business rules testing



      Ensure that       business rules are respected at all times:
                      QUICKCHECK




              APPLICATION BUSINESS LOGIC
                                                                  Sequences of interface calls
                                                                  could violate them

                        RDBMS
                                                                  Unit testing is           not enough



Laura M. Castro                                                 Improving sw. development with Erlang/OTP  40 of 46
Introduction
                                               From requirements to analysis and design
                                  Case study
                                               Implementation of a paradigm shift
                                Methodology
                                               Ensuring functionality and quality through testing
                                 Conclusions

 Data integrity validation via business rules testing



      Use QuickCheck     state machine model:

      initial_state    minimum to generate related test cases


        commands      interface functions to be tested


      precondition true
       next_state     test internal state update


      postcondition true

Laura M. Castro                                      Improving sw. development with Erlang/OTP  41 of 46
Introduction
                                           From requirements to analysis and design
                              Case study
                                           Implementation of a paradigm shift
                            Methodology
                                           Ensuring functionality and quality through testing
                             Conclusions

 Data integrity validation via business rules testing

      Business rules compliance check:
          specify BR as SQL sentence

          dene an invariant function to evaluate BR



      business_rule(Connection) -
         RenConsCount =
          db_interface:process_query(Connection,
            SELECT COUNT(*) 
             FROM renewal 
             WHERE ren_constr IS TRUE 
               AND ren_policy IN (SELECT pol_number 
                                    FROM policy ) 
             GROUP BY ren_policy ),
         ([] == [ R || R - RenConsCount, R  1]).


Laura M. Castro                                  Improving sw. development with Erlang/OTP  42 of 46
Introduction
                                         From requirements to analysis and design
                            Case study
                                         Implementation of a paradigm shift
                          Methodology
                                         Ensuring functionality and quality through testing
                           Conclusions

 Data integrity validation via business rules testing


      invariant() -
        {ok, Connection} = db_interface:start_transaction(),
        Result = business_rule(Connection),
        ...
        db_interface:rollback_transaction(Connection),
        Result.

      prop_business_logic() -
        ?FORALL(Commands, commands(?MODULE),
          begin
            true = invariant(),
            {History,S,Result} = run_commands(?MODULE,Commands),
            PostCondition = invariant(),
            clean_up(S),
            PostCondition and (Result == ok)
          end).

Laura M. Castro                                Improving sw. development with Erlang/OTP  43 of 46
Introduction
                                                From requirements to analysis and design
                                   Case study
                                                Implementation of a paradigm shift
                                 Methodology
                                                Ensuring functionality and quality through testing
                                  Conclusions

 Data integrity validation via business rules testing




      Methodology to      test business rules:
              Minimal internal state to conduct related operations
              Transitions are public interface exported functions
              Preconditions and postconditions are true
              Business rules (formulated as SQL sentences) are tested as
              invariants after test execution


Laura M. Castro                                       Improving sw. development with Erlang/OTP  44 of 46
Introduction
                                      Case study
                                    Methodology
                                     Conclusions




      1    Introduction



      2    Case study



      3    Functional software development methodology
                  From requirements to analysis and design
                  Implementation of a paradigm shift
                  Ensuring functionality and quality through testing



      4    Conclusions




Laura M. Castro                                     Improving sw. development with Erlang/OTP  45 of 46
Introduction
                                     Case study
                                   Methodology
                                    Conclusions

 Conclusions



      Functional programming represents a serious alternative for
      developing      real-world software:
              A   high-level abstraction tool, close to concepts and
              requirements
              Very   expressive and eective way of implementing
              complex algorithms


              A context disposed to     powerful testing techniques

Laura M. Castro                                    Improving sw. development with Erlang/OTP  46 of 46

Contenu connexe

Similaire à Improving software development using Erlang/OTP

Stc 2015 regional-round-ppt-exlopratory mobile testing with risk analysis
Stc 2015 regional-round-ppt-exlopratory mobile testing with risk analysisStc 2015 regional-round-ppt-exlopratory mobile testing with risk analysis
Stc 2015 regional-round-ppt-exlopratory mobile testing with risk analysisArchana Krushnan
 
Review on Agile Method with Text Mining
Review on Agile Method with Text MiningReview on Agile Method with Text Mining
Review on Agile Method with Text MiningIJARIIT
 
Performance Evaluation of Software Quality Model
Performance Evaluation of Software Quality ModelPerformance Evaluation of Software Quality Model
Performance Evaluation of Software Quality ModelEditor IJMTER
 
Exploratory testing STEW 2016
Exploratory testing STEW 2016Exploratory testing STEW 2016
Exploratory testing STEW 2016Per Runeson
 
A Method for Evaluating End-User Development Technologies
A Method for Evaluating End-User Development TechnologiesA Method for Evaluating End-User Development Technologies
A Method for Evaluating End-User Development TechnologiesClaudia Melo
 
ProductCamp Amsterdam Session 9 Rudy Katchow
ProductCamp Amsterdam Session 9 Rudy KatchowProductCamp Amsterdam Session 9 Rudy Katchow
ProductCamp Amsterdam Session 9 Rudy KatchowProductCamp Amsterdam
 
Resume_AnujTiwari
Resume_AnujTiwariResume_AnujTiwari
Resume_AnujTiwariAnuj Tiwari
 
Resume (Lo, Kelvin )
Resume (Lo, Kelvin )Resume (Lo, Kelvin )
Resume (Lo, Kelvin )Kelvin Lo
 
Maturing software engineering knowledge through classifications
Maturing software engineering knowledge through classificationsMaturing software engineering knowledge through classifications
Maturing software engineering knowledge through classificationsimmortalchhetri
 
Mindtrek 2015 - Tampere Finland
Mindtrek 2015 - Tampere Finland Mindtrek 2015 - Tampere Finland
Mindtrek 2015 - Tampere Finland Panos Fitsilis
 
Software Defect Prediction Using Local and Global Analysis
Software Defect Prediction Using Local and Global AnalysisSoftware Defect Prediction Using Local and Global Analysis
Software Defect Prediction Using Local and Global AnalysisEditor IJMTER
 
Evolvea Frameworkfor SelectingPrime Software DevelopmentProcess
Evolvea Frameworkfor SelectingPrime Software DevelopmentProcessEvolvea Frameworkfor SelectingPrime Software DevelopmentProcess
Evolvea Frameworkfor SelectingPrime Software DevelopmentProcessIJMER
 
Exploratory Testing, A Guide Towards Better Test Coverage.pdf
Exploratory Testing, A Guide Towards Better Test Coverage.pdfExploratory Testing, A Guide Towards Better Test Coverage.pdf
Exploratory Testing, A Guide Towards Better Test Coverage.pdfpCloudy
 

Similaire à Improving software development using Erlang/OTP (20)

Resume_Prashant
Resume_PrashantResume_Prashant
Resume_Prashant
 
D0704014018
D0704014018D0704014018
D0704014018
 
Stc 2015 regional-round-ppt-exlopratory mobile testing with risk analysis
Stc 2015 regional-round-ppt-exlopratory mobile testing with risk analysisStc 2015 regional-round-ppt-exlopratory mobile testing with risk analysis
Stc 2015 regional-round-ppt-exlopratory mobile testing with risk analysis
 
Review on Agile Method with Text Mining
Review on Agile Method with Text MiningReview on Agile Method with Text Mining
Review on Agile Method with Text Mining
 
Five Reasons to Choose Benchmark
Five Reasons to Choose BenchmarkFive Reasons to Choose Benchmark
Five Reasons to Choose Benchmark
 
Adaptive Trials
Adaptive TrialsAdaptive Trials
Adaptive Trials
 
Performance Evaluation of Software Quality Model
Performance Evaluation of Software Quality ModelPerformance Evaluation of Software Quality Model
Performance Evaluation of Software Quality Model
 
Exploratory testing STEW 2016
Exploratory testing STEW 2016Exploratory testing STEW 2016
Exploratory testing STEW 2016
 
A Method for Evaluating End-User Development Technologies
A Method for Evaluating End-User Development TechnologiesA Method for Evaluating End-User Development Technologies
A Method for Evaluating End-User Development Technologies
 
ProductCamp Amsterdam Session 9 Rudy Katchow
ProductCamp Amsterdam Session 9 Rudy KatchowProductCamp Amsterdam Session 9 Rudy Katchow
ProductCamp Amsterdam Session 9 Rudy Katchow
 
Resume_AnujTiwari
Resume_AnujTiwariResume_AnujTiwari
Resume_AnujTiwari
 
Pavankumar_V
Pavankumar_VPavankumar_V
Pavankumar_V
 
Resume (Lo, Kelvin )
Resume (Lo, Kelvin )Resume (Lo, Kelvin )
Resume (Lo, Kelvin )
 
Maturing software engineering knowledge through classifications
Maturing software engineering knowledge through classificationsMaturing software engineering knowledge through classifications
Maturing software engineering knowledge through classifications
 
Mindtrek 2015 - Tampere Finland
Mindtrek 2015 - Tampere Finland Mindtrek 2015 - Tampere Finland
Mindtrek 2015 - Tampere Finland
 
Evolutionary visual software analytics
Evolutionary visual software analyticsEvolutionary visual software analytics
Evolutionary visual software analytics
 
Software Defect Prediction Using Local and Global Analysis
Software Defect Prediction Using Local and Global AnalysisSoftware Defect Prediction Using Local and Global Analysis
Software Defect Prediction Using Local and Global Analysis
 
Evolvea Frameworkfor SelectingPrime Software DevelopmentProcess
Evolvea Frameworkfor SelectingPrime Software DevelopmentProcessEvolvea Frameworkfor SelectingPrime Software DevelopmentProcess
Evolvea Frameworkfor SelectingPrime Software DevelopmentProcess
 
Exploratory Testing, A Guide Towards Better Test Coverage.pdf
Exploratory Testing, A Guide Towards Better Test Coverage.pdfExploratory Testing, A Guide Towards Better Test Coverage.pdf
Exploratory Testing, A Guide Towards Better Test Coverage.pdf
 
CV_Dhanya
CV_DhanyaCV_Dhanya
CV_Dhanya
 

Plus de Laura M. Castro

Ola, ChatGPT... que carreira sería boa para min?
Ola, ChatGPT... que carreira sería boa para min?Ola, ChatGPT... que carreira sería boa para min?
Ola, ChatGPT... que carreira sería boa para min?Laura M. Castro
 
IAs xerativas e nesgos de xénero
IAs xerativas e nesgos de xéneroIAs xerativas e nesgos de xénero
IAs xerativas e nesgos de xéneroLaura M. Castro
 
As intelixencias artificiais como xeradoras de cultura: exploración dos nesgo...
As intelixencias artificiais como xeradoras de cultura: exploración dos nesgo...As intelixencias artificiais como xeradoras de cultura: exploración dos nesgo...
As intelixencias artificiais como xeradoras de cultura: exploración dos nesgo...Laura M. Castro
 
David vs. Goliat: lecciones aprendidas de una experiencia fallida de adopción...
David vs. Goliat: lecciones aprendidas de una experiencia fallida de adopción...David vs. Goliat: lecciones aprendidas de una experiencia fallida de adopción...
David vs. Goliat: lecciones aprendidas de una experiencia fallida de adopción...Laura M. Castro
 
Why on Earth would I test if I have to just "Let it crash"?
Why on Earth would I test if I have to just "Let it crash"?Why on Earth would I test if I have to just "Let it crash"?
Why on Earth would I test if I have to just "Let it crash"?Laura M. Castro
 
How the BEAM will change your mind
How the BEAM will change your mindHow the BEAM will change your mind
How the BEAM will change your mindLaura M. Castro
 
So I used Erlang... is my system as scalable as they say it'd be?
So I used Erlang... is my system as scalable as they say it'd be?So I used Erlang... is my system as scalable as they say it'd be?
So I used Erlang... is my system as scalable as they say it'd be?Laura M. Castro
 
Elixir: the not-so-hidden path to Erlang
Elixir: the not-so-hidden path to ErlangElixir: the not-so-hidden path to Erlang
Elixir: the not-so-hidden path to ErlangLaura M. Castro
 
Automatic generation of UML sequence diagrams from test counterexamples
Automatic generation of UML sequence diagrams from test counterexamplesAutomatic generation of UML sequence diagrams from test counterexamples
Automatic generation of UML sequence diagrams from test counterexamplesLaura M. Castro
 
Making property-based testing easier to read for humans
Making property-based testing easier to read for humansMaking property-based testing easier to read for humans
Making property-based testing easier to read for humansLaura M. Castro
 
Erlang as a supporting technology for teaching Software Architecture
Erlang as a supporting technology for teaching Software ArchitectureErlang as a supporting technology for teaching Software Architecture
Erlang as a supporting technology for teaching Software ArchitectureLaura M. Castro
 
A Backpack to go the Extra-Functional Mile (a hitched hike by the PROWESS pro...
A Backpack to go the Extra-Functional Mile (a hitched hike by the PROWESS pro...A Backpack to go the Extra-Functional Mile (a hitched hike by the PROWESS pro...
A Backpack to go the Extra-Functional Mile (a hitched hike by the PROWESS pro...Laura M. Castro
 
Experiencias Industriales con Programación Declarativa
Experiencias Industriales con Programación DeclarativaExperiencias Industriales con Programación Declarativa
Experiencias Industriales con Programación DeclarativaLaura M. Castro
 
Functional programming goes to Hollywood... and around the world!
Functional programming goes to Hollywood... and around the world!Functional programming goes to Hollywood... and around the world!
Functional programming goes to Hollywood... and around the world!Laura M. Castro
 
Failover and takeover contingency mechanisms for network partition and node f...
Failover and takeover contingency mechanisms for network partition and node f...Failover and takeover contingency mechanisms for network partition and node f...
Failover and takeover contingency mechanisms for network partition and node f...Laura M. Castro
 
Editing documents with LaTeX
Editing documents with LaTeXEditing documents with LaTeX
Editing documents with LaTeXLaura M. Castro
 
Introdución á edición de textos con LaTeX
Introdución á edición de textos con LaTeXIntrodución á edición de textos con LaTeX
Introdución á edición de textos con LaTeXLaura M. Castro
 
Edición de textos con LaTeX
Edición de textos con LaTeXEdición de textos con LaTeX
Edición de textos con LaTeXLaura M. Castro
 
Edición de textos con LaTeX
Edición de textos con LaTeXEdición de textos con LaTeX
Edición de textos con LaTeXLaura M. Castro
 

Plus de Laura M. Castro (20)

Ola, ChatGPT... que carreira sería boa para min?
Ola, ChatGPT... que carreira sería boa para min?Ola, ChatGPT... que carreira sería boa para min?
Ola, ChatGPT... que carreira sería boa para min?
 
IAs xerativas e nesgos de xénero
IAs xerativas e nesgos de xéneroIAs xerativas e nesgos de xénero
IAs xerativas e nesgos de xénero
 
As intelixencias artificiais como xeradoras de cultura: exploración dos nesgo...
As intelixencias artificiais como xeradoras de cultura: exploración dos nesgo...As intelixencias artificiais como xeradoras de cultura: exploración dos nesgo...
As intelixencias artificiais como xeradoras de cultura: exploración dos nesgo...
 
David vs. Goliat: lecciones aprendidas de una experiencia fallida de adopción...
David vs. Goliat: lecciones aprendidas de una experiencia fallida de adopción...David vs. Goliat: lecciones aprendidas de una experiencia fallida de adopción...
David vs. Goliat: lecciones aprendidas de una experiencia fallida de adopción...
 
Why on Earth would I test if I have to just "Let it crash"?
Why on Earth would I test if I have to just "Let it crash"?Why on Earth would I test if I have to just "Let it crash"?
Why on Earth would I test if I have to just "Let it crash"?
 
How the BEAM will change your mind
How the BEAM will change your mindHow the BEAM will change your mind
How the BEAM will change your mind
 
Elixir vs Java
Elixir vs JavaElixir vs Java
Elixir vs Java
 
So I used Erlang... is my system as scalable as they say it'd be?
So I used Erlang... is my system as scalable as they say it'd be?So I used Erlang... is my system as scalable as they say it'd be?
So I used Erlang... is my system as scalable as they say it'd be?
 
Elixir: the not-so-hidden path to Erlang
Elixir: the not-so-hidden path to ErlangElixir: the not-so-hidden path to Erlang
Elixir: the not-so-hidden path to Erlang
 
Automatic generation of UML sequence diagrams from test counterexamples
Automatic generation of UML sequence diagrams from test counterexamplesAutomatic generation of UML sequence diagrams from test counterexamples
Automatic generation of UML sequence diagrams from test counterexamples
 
Making property-based testing easier to read for humans
Making property-based testing easier to read for humansMaking property-based testing easier to read for humans
Making property-based testing easier to read for humans
 
Erlang as a supporting technology for teaching Software Architecture
Erlang as a supporting technology for teaching Software ArchitectureErlang as a supporting technology for teaching Software Architecture
Erlang as a supporting technology for teaching Software Architecture
 
A Backpack to go the Extra-Functional Mile (a hitched hike by the PROWESS pro...
A Backpack to go the Extra-Functional Mile (a hitched hike by the PROWESS pro...A Backpack to go the Extra-Functional Mile (a hitched hike by the PROWESS pro...
A Backpack to go the Extra-Functional Mile (a hitched hike by the PROWESS pro...
 
Experiencias Industriales con Programación Declarativa
Experiencias Industriales con Programación DeclarativaExperiencias Industriales con Programación Declarativa
Experiencias Industriales con Programación Declarativa
 
Functional programming goes to Hollywood... and around the world!
Functional programming goes to Hollywood... and around the world!Functional programming goes to Hollywood... and around the world!
Functional programming goes to Hollywood... and around the world!
 
Failover and takeover contingency mechanisms for network partition and node f...
Failover and takeover contingency mechanisms for network partition and node f...Failover and takeover contingency mechanisms for network partition and node f...
Failover and takeover contingency mechanisms for network partition and node f...
 
Editing documents with LaTeX
Editing documents with LaTeXEditing documents with LaTeX
Editing documents with LaTeX
 
Introdución á edición de textos con LaTeX
Introdución á edición de textos con LaTeXIntrodución á edición de textos con LaTeX
Introdución á edición de textos con LaTeX
 
Edición de textos con LaTeX
Edición de textos con LaTeXEdición de textos con LaTeX
Edición de textos con LaTeX
 
Edición de textos con LaTeX
Edición de textos con LaTeXEdición de textos con LaTeX
Edición de textos con LaTeX
 

Dernier

Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024Scott Keck-Warren
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
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
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
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
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfEnterprise Knowledge
 
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
 
Google AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGGoogle AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGSujit Pal
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxOnBoard
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
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
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 

Dernier (20)

Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
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
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
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
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.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
 
Google AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGGoogle AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAG
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptx
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
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...
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 

Improving software development using Erlang/OTP

  • 1. Introduction Case study Methodology Conclusions Improving software development using Erlang/OTP a case study Laura M. Castro Souto MADS Group Universidade da Coruña June 10th, 2010 Laura M. Castro Improving sw. development with Erlang/OTP 1 of 46
  • 2. Introduction Case study Methodology Conclusions Outline 1 Introduction 2 Case study 3 Functional software development methodology From requirements to analysis and design Implementation of a paradigm shift Ensuring functionality and quality through testing 4 Conclusions Laura M. Castro Improving sw. development with Erlang/OTP 2 of 46
  • 3. Introduction Case study Methodology Conclusions 1 Introduction 2 Case study 3 Functional software development methodology From requirements to analysis and design Implementation of a paradigm shift Ensuring functionality and quality through testing 4 Conclusions Laura M. Castro Improving sw. development with Erlang/OTP 3 of 46
  • 4. Introduction Case study Methodology Conclusions The questions How can we build better software. . . when the domain is extremely complex? when a lot of expert knowledge is required? when we want robust, distributed, fault-tolerant systems? when we look for versatile, exible, adaptable applications? Laura M. Castro Improving sw. development with Erlang/OTP 4 of 46
  • 5. Introduction Case study Methodology Conclusions The questions How can we build better software. . . when the domain is extremely complex? when a lot of expert knowledge is required? when we want robust, distributed, fault-tolerant systems? when we look for versatile, exible, adaptable applications? . . . using functional technology? Laura M. Castro Improving sw. development with Erlang/OTP 4 of 46
  • 6. Introduction Case study Methodology Conclusions Our answer A declarative paradigm-based software development methodology can achieve signicant improvement by means of quality assurance methods A declarative approximation is: more suitable to address and solve real-world problems compatible with traditional analysis and design techniques powerful to improve product quality Laura M. Castro Improving sw. development with Erlang/OTP 5 of 46
  • 7. Introduction Case study Methodology Conclusions 1 Introduction 2 Case study 3 Functional software development methodology From requirements to analysis and design Implementation of a paradigm shift Ensuring functionality and quality through testing 4 Conclusions Laura M. Castro Improving sw. development with Erlang/OTP 6 of 46
  • 8. Introduction Case study Methodology Conclusions Case study Advanced Risk Management Information System: Tracking Insurances, Claims, and Exposures A complex management application for a prominent eld At the time (2002), no alternatives from clients' perspective Today, still no comparable product in the market Specic and risky, client company did not have a R D Agreement with research group at local University Laura M. Castro Improving sw. development with Erlang/OTP 7 of 46
  • 9. Introduction Case study Methodology Conclusions Project requirements Modelling and management of organisation resources Modelling and management of potential risks Modelling and management of contracted insurance policies Including modelling and management of policy clauses Management of claims for accidents Selection of the most suitable warranty (help decision support system) Laura M. Castro Improving sw. development with Erlang/OTP 8 of 46
  • 10. Introduction Case study Methodology Conclusions Project information Client-server architecture Multiplatform lightweight Java client Server completely developed using Erlang/OTP Started in 2002, rst on-site deployment in 2005 Under maintenance since 2008 Development took around 200 person-months Up to ve developers (three of them full-time) Maintenance nowadays takes around 500 person-hours/year Total code size (server + client) ∼ (83000 + 66000) LOC Laura M. Castro Improving sw. development with Erlang/OTP 9 of 46
  • 11. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions 1 Introduction 2 Case study 3 Functional software development methodology From requirements to analysis and design Implementation of a paradigm shift Ensuring functionality and quality through testing 4 Conclusions Laura M. Castro Improving sw. development with Erlang/OTP 10 of 46
  • 12. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions From requirements to analysis and design Requirements elicitation: Risk situations have a number of specic properties, which may vary with time. Implication of experts is essential Structured and unstructured interviews provide good results Multidisciplinary teams are more productive Laura M. Castro Improving sw. development with Erlang/OTP 11 of 46
  • 13. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions From requirements to analysis and design O.O. analysis and standard UML favour communication Design patterns help to avoid known pitfalls REAL DATA Laura M. Castro Improving sw. development with Erlang/OTP 12 of 46
  • 14. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions From requirements to analysis and design O.O. analysis and standard UML favour communication Design patterns help to avoid known pitfalls Model formalisation as declarative statements Provides early validation Close to functional implementation, re-usable for testing Valuable for traceability Laura M. Castro Improving sw. development with Erlang/OTP 12 of 46
  • 15. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions Implementation of a paradigm shift Functionality implementation: Determination of policy relevance in the event of an accident. 1 No conict between object-oriented analysis and design, and implementation approach 2 High-level algorithm description eases the implementation task, improving eciency Laura M. Castro Improving sw. development with Erlang/OTP 13 of 46
  • 16. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions Object orientation vs. declarative paradigm The object-oriented perspective: is closer to the way we perceive real entities does not perform well when describing behavioural details grants stability of actors and interfaces The declarative perspective: is closer to the way we specify tasks and activities does not work comfortably at the big scale of things provides expressive ways of implementing algorithms Laura M. Castro Improving sw. development with Erlang/OTP 14 of 46
  • 17. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions Objects in Erlang/OTP Objects as data structures Objects as processes Laura M. Castro Improving sw. development with Erlang/OTP 15 of 46
  • 18. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions Objects in Erlang/OTP simple Objects as data structures immutable coarse grain concurrency Objects as processes low resource usage Laura M. Castro Improving sw. development with Erlang/OTP 15 of 46
  • 19. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions Objects in Erlang/OTP secure encapsulation Objects as data structures `mutable' ne grain concurrency Objects as processes more resource consuming Laura M. Castro Improving sw. development with Erlang/OTP 15 of 46
  • 20. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions Objects in Erlang/OTP Objects as data structures for short life, coarse concurrency business objects (risk objects, risk groups, risks, policies, accidents,. . . ), data types, etc. Objects as processes for long life, ne-grain concurrency data storage connection pool, user session manager, task server, le logger, conguration server, etc. Both are conveniently used in our study case ARMISTICE. Laura M. Castro Improving sw. development with Erlang/OTP 15 of 46
  • 21. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions Implementation of real-world behaviour Determination of policy relevance in the event of an accident. In Erlang syntax: Restriction = {hazard, Hazard} | {formula, {Name, Value}} | {string, Nuance} | {all, [Restriction]} | {any, [Restriction]} | ... Laura M. Castro Improving sw. development with Erlang/OTP 16 of 46
  • 22. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions Implementation of real-world behaviour relevant_policy(Hazard, PolicyClauses) - [ Clause || Clause - PolicyClauses, relevant(Hazard, Clause) =/= false ]. relevant(H, {hazard, H}) - true; relevant(H, {hazard, NH}) - false; relevant(H, {string, Nuance}) - Nuance; relevant(H, {all, Clauses}) - lists:foldl(fun(A, B) - and(A, B) end, true, [ relevant(H, C) || C - Clauses ]); relevant(H, {any, Clauses}) - lists:foldl(fun(A, B) - or(A, B) end, false, [ relevant(H, C) || C - Clauses ]); ... Laura M. Castro Improving sw. development with Erlang/OTP 17 of 46
  • 23. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions Ensuring functionality and quality through testing Testing There is a problem with ARMISTICE. . . Three types of testing scenarios (in theory): 1 Conformance of components to specication ( unit testing) 2 Appropriate interaction of components ( integration testing) 3 System behaviour in accordance with requirements ( validation) Laura M. Castro Improving sw. development with Erlang/OTP 18 of 46
  • 24. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions Ensuring functionality and quality through testing Testing There is a problem with ARMISTICE. . . Three types of testing scenarios (in the real world): 1 By-hand developer ad-hoc tests on own code 2 By-hand developer functionality testing 3 On-site user validation Laura M. Castro Improving sw. development with Erlang/OTP 18 of 46
  • 25. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions Unit testing of data types using properties Unit testing Does the decimal custom data type conform to its specication? Sometimes a custom implementation of a data type is in place (i.e., ARMISTICE currency data type) Requirement : support for multiple currencies, exchange rates Requirement : 16 decimal digits precision Technical requirement : uniform marshalling/unmarshalling Laura M. Castro Improving sw. development with Erlang/OTP 19 of 46
  • 26. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions Unit testing of data types using properties new Initial strategy: single-value tuple-value Use an automatic testing tool generate random decimal integer-part decimal-part to int float string int string nat string values: QuickCheck decimal() - ?LET(Tuple, {int(), nat()}, decimal:new(Tuple)). Laura M. Castro Improving sw. development with Erlang/OTP 20 of 46
  • 27. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions Unit testing of data types using properties prop_sum_comm() - ?FORALL({D1, D2}, {decimal(), decimal()}, decimal:sum(D1, D2) == decimal:sum(D2, D1)). Thousands of randomly generated test cases will pass for this kind of properties Laura M. Castro Improving sw. development with Erlang/OTP 21 of 46
  • 28. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions Unit testing of data types using properties prop_sum_comm() - ?FORALL({D1, D2}, {decimal(), decimal()}, decimal:sum(D1, D2) == decimal:sum(D2, D1)). Thousands of randomly generated test cases will pass for this kind of properties but. . . which other properties do we add? when do we have suciently many of them? Laura M. Castro Improving sw. development with Erlang/OTP 21 of 46
  • 29. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions Unit testing of data types using properties Dene a model for the data type: [sum(di , dj )] ≡ [di ] + [dj ] [subs (di , dj )] ≡ [di ] − [dj ] [mult (di , dj )] ≡ [di ] ∗ [dj ] [divs (di , dj )] ≡ [di ] / [dj ] ... decimal_model(Decimal) - decimal:get_value(Decimal). Erlang/C oating point implementation (IEEE 754-1985 standard) Laura M. Castro Improving sw. development with Erlang/OTP 22 of 46
  • 30. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions Unit testing of data types using properties prop_sum() - ?FORALL({D1, D2}, {decimal(), decimal()}, decimal_model(decimal:sum(D1, D2)) == decimal_model(D1) + decimal_model(D2)). Laura M. Castro Improving sw. development with Erlang/OTP 23 of 46
  • 31. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions Unit testing of data types using properties prop_sum() - ?FORALL({D1, D2}, {decimal(), decimal()}, decimal_model(decimal:sum(D1, D2)) == decimal_model(D1) + decimal_model(D2)). Problem: errors show internal representation eqc:quickcheck(decimal_eqc:prop_sum()). ....Failed! After 5 tests. {{decimal,1000000000000000}, {decimal,11000000000000000}} false Laura M. Castro Improving sw. development with Erlang/OTP 23 of 46
  • 32. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions Unit testing of data types using properties Use symbolic data structures in test generation: decimal() - ?LET(Tuple, {int(),nat()}, {call,decimal,new,[Tuple]}). prop_sum() - ?FORALL({SD1, SD2}, {decimal(), decimal()}, begin D1 = eval(SD1), D2 = eval(SD2), decimal_model(decimal:sum(D1, D2)) == decimal_model(D1) + decimal_model(D2) end). Laura M. Castro Improving sw. development with Erlang/OTP 24 of 46
  • 33. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions Unit testing of data types using properties Errors reported with symbolic values are easier to understand: eqc:quickcheck(decimal_eqc:prop_sum()). ........Failed! After 9 tests. {{call,decimal,new,[2,1]}, {call,decimal,new,[2,2]}} Shrinking..(2 times) {{call,decimal,new,[0,1]}, {call,decimal,new,[0,2]}} false 0. 1 + 0. 2 = 0. 3 ? Indeed, due to unavoidable IEEE 754-1985 rounding problem. Laura M. Castro Improving sw. development with Erlang/OTP 25 of 46
  • 34. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions Unit testing of data types using properties Adjust the model: |a| − |b | abs x −y a≈b⇔ rel , x = max(|a|, |b |), y = min(|a|, |b |) x abs = 10−16 , rel = 10−10 prop_sum() - ?FORALL({SD1, SD2}, {decimal(), decimal()}, begin D1 = eval(SD1), D2 = eval(SD2), equivalent(decimal_model(decimal:sum(D1, D2)), decimal_model(D1) + decimal_model(D2)) end). Laura M. Castro Improving sw. development with Erlang/OTP 26 of 46
  • 35. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions Unit testing of data types using properties Beware we may feel satised with this unit testing but: It is not exhaustive We have not tested all possibilities for decimal:new/1 It is not complete decimal ... We have not tested operations new sum mult combination single-value tuple-value integer-part decimal-part int float string int string nat string Laura M. Castro Improving sw. development with Erlang/OTP 27 of 46
  • 36. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions Unit testing of data types using properties Introduce recursive generators including `generator' operations: decimal() - ?SIZED(Size, decimal(Size)). decimal(0) - {call,decimal,new,[oneof([int(), real(), dec_string(), {oneof([int(), list(digit())]), oneof([nat(), list(digit())])} ])]}; decimal(Size) - Smaller = decimal(Size div 2), oneof([decimal(0), {call, decimal, sum, [Smaller,Smaller]}, {call, decimal, mult,[Smaller,Smaller]}, ...]). Laura M. Castro Improving sw. development with Erlang/OTP 28 of 46
  • 37. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions Unit testing of data types using properties Shrinking customisation can improve counterexample quality: decimal(Size) - Smaller = decimal(Size div 2), oneof([decimal(0), ?LETSHRINK([D1, D2], [Smaller, Smaller], {call, decimal, sum, [D1, D2]}), ?LETSHRINK([D1, D2], [Smaller, Smaller], {call, decimal, mult, [D1, D2]}), ...]). Laura M. Castro Improving sw. development with Erlang/OTP 29 of 46
  • 38. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions Unit testing of data types using properties Error scenarios ( negative testing) must be checked at properties: prop_divs() - ?FORALL({SD1, SD2}, {decimal(), decimal()}, begin D1 = eval(SD1), D2 = eval(SD2), case equivalent(decimal_model(D2), 0.0) of true - {’EXIT’,_} = catch (decimal_model(D1)/ decimal_model(D2)), {error, _} = decimal:divs(D1, D2); false - equivalent(decimal_model(decimal:divs(D1, D2)), decimal_model(D1)/decimal_model(D2)) end end). Laura M. Castro Improving sw. development with Erlang/OTP 30 of 46
  • 39. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions Unit testing of data types using properties Generator must be well-dened, with additional base case test: defined(E) - case catch eval(E) of {’EXIT’, _} - false _Value - true; end. well_defined(G) - ?SUCHTHAT(E, G, defined(E)). decimal() - ?SIZED(Size, well_defined(decimal(Size))). prop_new() - ?FORALL(SD,decimal(0),is_float(decimal_model(eval(SD)))). Laura M. Castro Improving sw. development with Erlang/OTP 31 of 46
  • 40. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions Unit testing of data types using properties Methodology to guarantee full testing: 1 Denition of a suitable model for the data type 2 Generation of well-dened, symbolic values including all productive operations 3 Denition of one property for each operation considering expected failing cases 4 Fine-tuning of shrinking preferences Laura M. Castro Improving sw. development with Erlang/OTP 32 of 46
  • 41. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions State machine-based integration testing Integration testing Do the appropriate components interact as expected when creating a new risk group? Software is usually structured in dierent components Must be tested on their own to ensure they perform correctly, in combination to ensure they interact properly Components treated as working black boxes Laura M. Castro Improving sw. development with Erlang/OTP 33 of 46
  • 42. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions QuickCheck state machine testing Load information about the system: user sessions, risk groups identiers, risk objects identiers, etc. Laura M. Castro Improving sw. development with Erlang/OTP 34 of 46
  • 43. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions QuickCheck state machine testing -record(state, {user_sessions, groups, objects}). initial_state()- #state{user_sessions = [], groups = [], objects = []}. Laura M. Castro Improving sw. development with Erlang/OTP 34 of 46
  • 44. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions QuickCheck state machine testing Pick one of possible service invocations Use frequency to specify probabilities Introduce `anomalies' (i.e., delays) Laura M. Castro Improving sw. development with Erlang/OTP 34 of 46
  • 45. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions QuickCheck state machine testing command(S) - frequency( ... [{7,{call, risk_group_facade, new_risk_group, [oneof(S#state.user_sessions), group_name()]}} || S#state.user_sessions =/= []], ... ). Laura M. Castro Improving sw. development with Erlang/OTP 34 of 46
  • 46. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions QuickCheck state machine testing Check whether current status allows invocation of chosen service: no previous conditions required to create a new risk group Laura M. Castro Improving sw. development with Erlang/OTP 34 of 46
  • 47. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions QuickCheck state machine testing precondition(S, {call,risk_group_facade, new_risk_group, [SessionID, Name]})- true; Laura M. Castro Improving sw. development with Erlang/OTP 34 of 46
  • 48. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions QuickCheck state machine testing Service invocation execution may aect the test state: a new risk group identier is added Laura M. Castro Improving sw. development with Erlang/OTP 34 of 46
  • 49. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions QuickCheck state machine testing next_state(S, Value, {call,risk_group_facade, new_risk_group, Arguments}) - S#state{groups = [ Value | S#state.groups ]}; Laura M. Castro Improving sw. development with Erlang/OTP 34 of 46
  • 50. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions QuickCheck state machine testing Check properties the system must hold after service execution: no previous conditions required to create a new risk group Laura M. Castro Improving sw. development with Erlang/OTP 34 of 46
  • 51. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions QuickCheck state machine testing postcondition(S, {call,risk_group_facade, new_risk_group, Arguments}, Result)- true; Laura M. Castro Improving sw. development with Erlang/OTP 34 of 46
  • 52. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions QuickCheck state machine testing QuickCheck shrinks the failing test case to the shortest sequence of commands which invocation leads to the same error Laura M. Castro Improving sw. development with Erlang/OTP 34 of 46
  • 53. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions QuickCheck state machine testing Proceed to next test case, or Exit reporting test pass Laura M. Castro Improving sw. development with Erlang/OTP 34 of 46
  • 54. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions QuickCheck state machine-based integration testing Integration test success: Laura M. Castro Improving sw. development with Erlang/OTP 35 of 46
  • 55. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions QuickCheck state machine-based integration testing Integration test success: verication of expected function calls ( dummy component) Reduced eort Collateral eects avoidance Early-stage problems detection Laura M. Castro Improving sw. development with Erlang/OTP 35 of 46
  • 56. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions QuickCheck state machine-based integration testing Original source code: new_risk_group(SessionID, GroupName, GroupDescription)- {ok, GroupData} = risk_group_dao:new_skeleton(SessionID), [{oid,GroupID}, {code,GroupCode}, {name,DefName},{desc,EmptyDescription}] = GroupData, ok = risk_group_dao:update(SessionID, GroupID, GroupName, GroupDescription), ok = risk_group_dao:unlock(SessionID, GroupID), {ok, [{oid, GroupID}, {code, GroupCode}, {name, GroupName}, {desc, GroupDescription}]}. Laura M. Castro Improving sw. development with Erlang/OTP 36 of 46
  • 57. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions QuickCheck state machine-based integration testing Dummy component source code: new_risk_group(SessionID, GroupName, GroupDescription)- GroupData = [{oid,group_id()}, {code,group_code()}, {name,GroupName}, {desc,GroupDescription}], op_logger:add({risk_group_dao, new_skeleton, [SessionID], {ok, GroupData}}), op_logger:add({risk_group_dao, update, [SessionID, GroupID, GroupCode, GroupName, GroupDescription], ok}), op_logger:add({risk_group_dao, unlock, [SessionID, GroupID], ok}), {ok, GroupData}. Laura M. Castro Improving sw. development with Erlang/OTP 36 of 46
  • 58. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions QuickCheck state machine-based integration testing Testing state machine postcondition and property: postcondition(S, {call,risk_group_facade, new_risk_group,Arguments}, Result)- Operations = op_logger:get({new_risk_group}), check(new_risk_group, {S,Arguments,Operations,Result}); prop_integration() - ?FORALL(Commands, commands(?MODULE), begin {History,S,Result} = run_commands(?MODULE,Commands), Result == ok end). Laura M. Castro Improving sw. development with Erlang/OTP 37 of 46
  • 59. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions QuickCheck state machine-based integration testing Methodology to fully test component integration: Internal state stores minimal information for test generation Transitions are operations to be tested Interactions are performed against dummy objects Preconditions are true, postconditions check correct sequence of interactions Laura M. Castro Improving sw. development with Erlang/OTP 38 of 46
  • 60. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions Data integrity validation via business rules testing Validation Does the system enforce that there is only one policy renewal under construction at a time? Complex, data-intensive software usually handles great number of business objects with complex relationships Few basic data consistency constraints are enforced by storage media (i.e., DBMS) Too complex, change dynamically, non-trivial calculations,. . . Laura M. Castro Improving sw. development with Erlang/OTP 39 of 46
  • 61. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions Data integrity validation via business rules testing Ensure that business rules are respected at all times: APPLICATION INTERFACE APPLICATION BUSINESS LOGIC Sequences of interface calls could violate them RDBMS Unit testing is not enough Laura M. Castro Improving sw. development with Erlang/OTP 40 of 46
  • 62. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions Data integrity validation via business rules testing Ensure that business rules are respected at all times: t in po s APPLICATION INTERFACE c es ac APPLICATION BUSINESS LOGIC Sequences of interface calls could violate them ed tru st RDBMS Unit testing is not enough Laura M. Castro Improving sw. development with Erlang/OTP 40 of 46
  • 63. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions Data integrity validation via business rules testing Ensure that business rules are respected at all times: QUICKCHECK APPLICATION BUSINESS LOGIC Sequences of interface calls could violate them RDBMS Unit testing is not enough Laura M. Castro Improving sw. development with Erlang/OTP 40 of 46
  • 64. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions Data integrity validation via business rules testing Use QuickCheck state machine model: initial_state minimum to generate related test cases commands interface functions to be tested precondition true next_state test internal state update postcondition true Laura M. Castro Improving sw. development with Erlang/OTP 41 of 46
  • 65. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions Data integrity validation via business rules testing Business rules compliance check: specify BR as SQL sentence dene an invariant function to evaluate BR business_rule(Connection) - RenConsCount = db_interface:process_query(Connection, SELECT COUNT(*) FROM renewal WHERE ren_constr IS TRUE AND ren_policy IN (SELECT pol_number FROM policy ) GROUP BY ren_policy ), ([] == [ R || R - RenConsCount, R 1]). Laura M. Castro Improving sw. development with Erlang/OTP 42 of 46
  • 66. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions Data integrity validation via business rules testing invariant() - {ok, Connection} = db_interface:start_transaction(), Result = business_rule(Connection), ... db_interface:rollback_transaction(Connection), Result. prop_business_logic() - ?FORALL(Commands, commands(?MODULE), begin true = invariant(), {History,S,Result} = run_commands(?MODULE,Commands), PostCondition = invariant(), clean_up(S), PostCondition and (Result == ok) end). Laura M. Castro Improving sw. development with Erlang/OTP 43 of 46
  • 67. Introduction From requirements to analysis and design Case study Implementation of a paradigm shift Methodology Ensuring functionality and quality through testing Conclusions Data integrity validation via business rules testing Methodology to test business rules: Minimal internal state to conduct related operations Transitions are public interface exported functions Preconditions and postconditions are true Business rules (formulated as SQL sentences) are tested as invariants after test execution Laura M. Castro Improving sw. development with Erlang/OTP 44 of 46
  • 68. Introduction Case study Methodology Conclusions 1 Introduction 2 Case study 3 Functional software development methodology From requirements to analysis and design Implementation of a paradigm shift Ensuring functionality and quality through testing 4 Conclusions Laura M. Castro Improving sw. development with Erlang/OTP 45 of 46
  • 69. Introduction Case study Methodology Conclusions Conclusions Functional programming represents a serious alternative for developing real-world software: A high-level abstraction tool, close to concepts and requirements Very expressive and eective way of implementing complex algorithms A context disposed to powerful testing techniques Laura M. Castro Improving sw. development with Erlang/OTP 46 of 46