Introduction                                 Case study                               Methodology                         ...
Introduction                                      Case study                                    Methodology               ...
Introduction                                      Case study                                    Methodology               ...
Introduction                                   Case study                                 Methodology                     ...
Introduction                                   Case study                                 Methodology                     ...
Introduction                                    Case study                                  Methodology                   ...
Introduction                                      Case study                                    Methodology               ...
Introduction                                     Case study                                   Methodology                 ...
Introduction                                   Case study                                 Methodology                     ...
Introduction                                    Case study                                  Methodology                   ...
Introduction                                                   From requirements to analysis and design                   ...
Introduction                                                   From requirements to analysis and design                   ...
Introduction                                                 From requirements to analysis and design                     ...
Introduction                                                 From requirements to analysis and design                     ...
Introduction                                                 From requirements to analysis and design                     ...
Introduction                                                  From requirements to analysis and design                    ...
Introduction                                              From requirements to analysis and design                        ...
Introduction                                              From requirements to analysis and design                        ...
Introduction                                              From requirements to analysis and design                        ...
Introduction                                                  From requirements to analysis and design                    ...
Introduction                                                 From requirements to analysis and design                     ...
Introduction                                         From requirements to analysis and design                            C...
Introduction                                                  From requirements to analysis and design                    ...
Introduction                                                  From requirements to analysis and design                    ...
Introduction                                                 From requirements to analysis and design                     ...
Introduction                                                                             From requirements to analysis and...
Introduction                                           From requirements to analysis and design                           ...
Introduction                                               From requirements to analysis and design                       ...
Introduction                                                From requirements to analysis and design                      ...
Introduction                                         From requirements to analysis and design                            C...
Introduction                                              From requirements to analysis and design                        ...
Introduction                                              From requirements to analysis and design                        ...
Introduction                                             From requirements to analysis and design                         ...
Introduction                                              From requirements to analysis and design                        ...
Introduction                                                    From requirements to analysis and design                  ...
Introduction                                              From requirements to analysis and design                        ...
Introduction                                           From requirements to analysis and design                           ...
Introduction                                                From requirements to analysis and design                      ...
Introduction                                             From requirements to analysis and design                         ...
Introduction                                                  From requirements to analysis and design                    ...
Introduction                                                   From requirements to analysis and design                   ...
Introduction                                                 From requirements to analysis and design                     ...
Introduction                                        From requirements to analysis and design                           Cas...
Introduction                                                  From requirements to analysis and design                    ...
Introduction                                        From requirements to analysis and design                           Cas...
Introduction                                               From requirements to analysis and design                       ...
Introduction                                        From requirements to analysis and design                           Cas...
Introduction                                               From requirements to analysis and design                       ...
Introduction                                        From requirements to analysis and design                           Cas...
Introduction                                               From requirements to analysis and design                       ...
Introduction                                        From requirements to analysis and design                           Cas...
Introduction                                                      From requirements to analysis and design                ...
Introduction                                                From requirements to analysis and design                      ...
Introduction                                                 From requirements to analysis and design                     ...
Introduction                                             From requirements to analysis and design                         ...
Introduction                                             From requirements to analysis and design                         ...
Introduction                                         From requirements to analysis and design                            C...
Introduction                                              From requirements to analysis and design                        ...
Introduction                                                From requirements to analysis and design                      ...
Introduction                                                   From requirements to analysis and design                   ...
Introduction                                                          From requirements to analysis and design            ...
Introduction                                                                   From requirements to analysis and design   ...
Introduction                                                          From requirements to analysis and design            ...
Introduction                                               From requirements to analysis and design                       ...
Introduction                                           From requirements to analysis and design                           ...
Introduction                                         From requirements to analysis and design                            C...
Introduction                                                From requirements to analysis and design                      ...
Introduction                                      Case study                                    Methodology               ...
Introduction                                     Case study                                   Methodology                 ...
Upcoming SlideShare
Loading in …5
×

Improving software development using Erlang/OTP

715 views
653 views

Published on

Erlang Factory London 2010.

Published in: Technology, News & Politics
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
715
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
13
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Improving software development using Erlang/OTP

  1. 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, 2010Laura M. Castro Improving sw. development with Erlang/OTP 1 of 46
  2. 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 ConclusionsLaura M. Castro Improving sw. development with Erlang/OTP 2 of 46
  3. 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 ConclusionsLaura M. Castro Improving sw. development with Erlang/OTP 3 of 46
  4. 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. 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. 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 qualityLaura M. Castro Improving sw. development with Erlang/OTP 5 of 46
  7. 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 ConclusionsLaura M. Castro Improving sw. development with Erlang/OTP 6 of 46
  8. 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 UniversityLaura M. Castro Improving sw. development with Erlang/OTP 7 of 46
  9. 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. 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) LOCLaura M. Castro Improving sw. development with Erlang/OTP 9 of 46
  11. 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 ConclusionsLaura M. Castro Improving sw. development with Erlang/OTP 10 of 46
  12. 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 productiveLaura M. Castro Improving sw. development with Erlang/OTP 11 of 46
  13. 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 DATALaura M. Castro Improving sw. development with Erlang/OTP 12 of 46
  14. 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 traceabilityLaura M. Castro Improving sw. development with Erlang/OTP 12 of 46
  15. 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 eciencyLaura M. Castro Improving sw. development with Erlang/OTP 13 of 46
  16. 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 algorithmsLaura M. Castro Improving sw. development with Erlang/OTP 14 of 46
  17. 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 processesLaura M. Castro Improving sw. development with Erlang/OTP 15 of 46
  18. 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 usageLaura M. Castro Improving sw. development with Erlang/OTP 15 of 46
  19. 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 consumingLaura M. Castro Improving sw. development with Erlang/OTP 15 of 46
  20. 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. 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. 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. 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. 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 validationLaura M. Castro Improving sw. development with Erlang/OTP 18 of 46
  25. 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/unmarshallingLaura M. Castro Improving sw. development with Erlang/OTP 19 of 46
  26. 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. 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 propertiesLaura M. Castro Improving sw. development with Erlang/OTP 21 of 46
  28. 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. 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. 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. 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}} falseLaura M. Castro Improving sw. development with Erlang/OTP 23 of 46
  32. 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. 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. 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. 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 stringLaura M. Castro Improving sw. development with Erlang/OTP 27 of 46
  36. 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. 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. 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. 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. 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 preferencesLaura M. Castro Improving sw. development with Erlang/OTP 32 of 46
  41. 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 boxesLaura M. Castro Improving sw. development with Erlang/OTP 33 of 46
  42. 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. 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. 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. 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. 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 groupLaura M. Castro Improving sw. development with Erlang/OTP 34 of 46
  47. 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. 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 addedLaura M. Castro Improving sw. development with Erlang/OTP 34 of 46
  49. 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. 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 groupLaura M. Castro Improving sw. development with Erlang/OTP 34 of 46
  51. 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. 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 errorLaura M. Castro Improving sw. development with Erlang/OTP 34 of 46
  53. 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 passLaura M. Castro Improving sw. development with Erlang/OTP 34 of 46
  54. 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. 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 detectionLaura M. Castro Improving sw. development with Erlang/OTP 35 of 46
  56. 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. 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. 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. 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 interactionsLaura M. Castro Improving sw. development with Erlang/OTP 38 of 46
  60. 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. 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 enoughLaura M. Castro Improving sw. development with Erlang/OTP 40 of 46
  62. 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 enoughLaura M. Castro Improving sw. development with Erlang/OTP 40 of 46
  63. 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 enoughLaura M. Castro Improving sw. development with Erlang/OTP 40 of 46
  64. 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 trueLaura M. Castro Improving sw. development with Erlang/OTP 41 of 46
  65. 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. 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. 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 executionLaura M. Castro Improving sw. development with Erlang/OTP 44 of 46
  68. 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 ConclusionsLaura M. Castro Improving sw. development with Erlang/OTP 45 of 46
  69. 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 techniquesLaura M. Castro Improving sw. development with Erlang/OTP 46 of 46

×