1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001...

71
1 Maintainability, Maintainability, Reusability, Debugging Reusability, Debugging , , Testing Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto: carlfrs @ idi .ntnu.no

Transcript of 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001...

Page 1: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

1

Code Quality, Maintainability, Code Quality, Maintainability, Reusability, DebuggingReusability, Debugging, Testing, Testing

SIF8080, Sep. 27th 2001

Customer-driven project

Carl-Fredrik Sørensen mailto:[email protected]

Page 2: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

2

Spider-webSpider-web::theoretical

::pck_stream

::pck_cargo

::choke

::lift_account

::pck_stock

::pck_cargo_doc

::units

::lagkodeserver

::pck_check

::pck_stream_network

::pck_well

::sep_test

::pck_flowline

::pck_facility

::pck_system

::mathlib

::pck_regression

::calc_stream::comp_analysis::regularity

::well_node

::puf

::summarise

::tbp_product

::transfer_basis

::value_adjust

Page 3: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

3

OutlineOutline

Code Quality & Standards.Debugging, logging etc.Debugging, logging etc.Testing.Testing.

Page 4: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

4

Key Principles; CodingKey Principles; Coding

UnderstandabilityHigh cohesionLoose couplingCode FormattingConsistent Naming Information hiding Valuable Comments

Page 5: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

5

Code Standards (1)Code Standards (1)

Why?– Gives less defects.– Easier/cheaper maintenance.– Several people may work on and understand the same

code.– Code to be read, not only written.

Java coding standards:– The Elements of Java Style; Vermeulen et.al. SIGS Books.– http://java.sun.com/docs/codeconv/html/CodeConvTOC

.doc.html.

Page 6: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

6

Code Standards (2)Code Standards (2)

General rules:– Simplicity – Build simple classes and methods.

Keep it as simple as possible, but not simpler (Einstein).

– Clarity – Ensure item has a clear purpose. Explain where, when, why, and how to use each.

– Completeness – Create complete documentation; document all features and functionality.

Page 7: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

7

Code Standards (3)Code Standards (3)

General rules (continued):– Consistency – Similar entities should look and

behave the same; dissimilar entities should look and behave differently. Create and apply standards whenever possible.

– Robustness – Provide predictable documented behaviour in response to errors and exceptions. Do not hide errors and do not force clients to detect errors.

Page 8: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

8

Code Standards (4)Code Standards (4)

Do it right the first time !Your professionalism is expressed by applying

code standards !Document any deviations!

Page 9: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

9

FormattingFormatting

Is important for readability, not for the compiler.

Use a common standard for code formatting.Do not alter the style of old code to fit new

standards.

Page 10: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

10

Examples (1)Examples (1)

class MyClass {

void function (int arg) {

if (arg < 0) {

for (int index = 0; index <= arg; index++) {

//… Some Action Code …

} // end for

} // end if

} // end function

} // end MyClass

Page 11: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

11

Examples (2)Examples (2)

Include white space:– Bad: double length=Math.sqrt(x*x+y*y);– Better: double length = Math.sqrt(x * x + y * y);– Use blank lines to separate.– Do not use hard tabs.

Page 12: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

12

NamingNaming

Clear, unambiguous, readable, meaningful. Describe the purpose of the item:– Bad: X1, X2, mth, get, tmp, temp, result.– Give a descriptive name to temporary variables.

But: scientific formulas may be better formulated with single characters/words representing symbols instead of descriptive names.

Page 13: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

13

NamingNaming

Establish and use a common naming convention. Problems creating a good name purpose of the

operation is not clear.– Bad: void get(…)., better: retrieveDataSamples.– Bad: Time day(Time p_day), better: getDate or

getTruncDate.– Bad: void result(…), better: createResults.– Bad: void gas/oil/water, better: calculate…VolumeRate.

Page 14: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

14

Java Java Naming ConventionNaming Convention

Package: scope.mypackageClasses: MyClassMethods: myMethodConstants: MY_CONSTANTAttribute: myAttributeVariable: myVariable

Page 15: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

15

ParametersParameters

Actual parameters should match the formal Input-modify-output order If several operations use similar parameters, put the

similar parameters in a consistent order Use all parameters Document interface assumptions about parameters

– access type, unit, ranges, non-valid values

Limit the number of parameters to about seven

Page 16: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

16

CommentsComments; ; Why, when, where, Why, when, where, what what

Why: To be able to find out what a operation does after a half, one or two years. Automatic API documentation.

When; Document your code before or when you write it; Design before you implement. Put the design in the operation.

Where; Before the operation, at specific formulas, decision points etc.

What; Document the algorithm, avoid unnecessary comments. Refer to a specification if existing.

Page 17: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

17

JavaDoc (1)JavaDoc (1)

Generates HTML-formatted class reference or API documentation.

Does only recognise documentation comments that appear immediately before– class– Interface– constructor, – method – field declaration.

Page 18: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

18

JavaDoc (2)JavaDoc (2)

Purpose: To define a programming contract between a client and a supplier of a service.

Keep the documentation synchronised with the code. MAKE DOCUMENTATION FIRST, then code!

JavaDoc tags:– @author, @version, @see, @param, @return, @exception.– {@link}.

Page 19: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

19

JavaDoc Example: Class JavaDoc Example: Class

/**

* <code> MyConstants </code> is the base class for all the constants and

* implements any general constant responsibilities.

*

* @author Carl-Fredrik Sørensen

* @version $Revision: 1.0$

* @invariants p > 0

*

* @see MySpecificConstants

*/

Page 20: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

20

JavaDoc (3)JavaDoc (3)

Document pre-, post- and invariant conditions (OCL…).– @pre-condition, @post-condition, @invariants.

Document known defects and deficiencies.– @defect.

Document synchronisation semantics.

Page 21: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

21

JavaDoc Example: Method JavaDoc Example: Method

/**

* Method description

*

* @param paramName Name of the mechanism to search for,

* one of the constants in the <code>MyClass</code> class.

* @return The concrete instance of an <code>MyClass</code>

* that is currently in effect if one found, null if not.

* @exception Throwable Default finalizer exception.

* @pre-condition valid paramName.

* @post-condition (… described in @return here…)

*/

Page 22: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

22

Architecture; How to Avoid Architecture; How to Avoid Spider-webSpider-web

Class/package organisation (loose coupling, high cohesion):– Split classes in (package/service) layers (user, data and

business). Use package scoping (no.ntnu.idi…..).– Uni-directional dependencies.

Page 23: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

23

Refactor to a New ArchitectureRefactor to a New Architecture

::EcBpStreamFlare

::EcDpStream ::EcDpWellReservoir

::EcBpStreamFluid::EcBpStreamShipper ::EcDpWellStream

::EcDpStreamFluid::Theoretical

::EcBpStream::EcDpDerivedStream

::calc_stream

::comp_analysis

Page 24: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

24

Information HidingInformation Hiding Do not expose operations that should be local to a

package. Hide data access from the business services.

– Create separate packages for performing data services.– Define interfaces for data access, like e.g. EJB.

Scoping:– public: classes exposed by interfaces, operations in

interfaces.– package: classes and operation not exposed through

interface, but used by other classes in package.– private: local attributes and methods.

Page 25: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

25

Information HidingInformation Hiding

Hide the action part in control structures (functional cohesion) if complex, else delegate to a method.

What to hide:– Areas that are likely to change; hardware dependencies,

input/output, non-standard language features, difficult design and implementation areas, data-size constraints, business rules, potential changes.

– Complex data.– Complex logic.

Page 26: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

26

BindingBinding

Bind constants as late as possible– Do not use magic Numbers, avoid hard-coded values

totalFooDay = totalFooHour * 24;

if (me.equals(”thirsty”)) return ”water”;

– Avoid global variables (constants OK)– Use separate classes/methods to hide hard-coded values

Achieves faster maintenance, and avoids copy-paste errors Makes code better suited for reuse Static methods and/or constants

MyConstants.C1_SPECIFIC_GRAVITY

Page 27: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

27

Java Exceptions (1)Java Exceptions (1)

Unchecked run-time exception: serious unexpected errors that may indicate an error in the program’s logic Termination.

Checked exception: errors that may occur, however rarely, under normal program operation The caller must catch this exception.

Page 28: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

28

Java Exceptions (2)Java Exceptions (2)

Only convert exceptions to add information. If the method does not know how to handle an exception it should not be handled.

Do not silently absorb a run-time or error exception makes code very hard to debug.

Use finally blocks to release resources.

Page 29: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

29

Code Defensively (1)Code Defensively (1)

Check input data for validity (Pre-conditions).– Range, comment assumptions about acceptable input ranges

in the code.– Use a general approach for error handling when erroneous

data. Use exception handling only to draw attention to

unexpected cases (Do NOT perform any processing in exception code) (invariants).

Anticipate changes; Hide to minimise impact of change.

Page 30: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

30

Code Defensively (2)Code Defensively (2)

Introduce debugging aids early (logging).Check function return values (post-conditions).Return friendly error messages; Write to a log

file any system specific error messages (IO/SQL Exceptions, error codes etc.).

Page 31: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

31

SummarySummary

Remember your code should be understandable.Maintenance is often up to 70% of a total

project cost.Use quality control.

Page 32: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

32

OutlineOutline

Code quality and Code Standards.Code quality and Code Standards.Debugging, logging etc.Testing.Testing.

Page 33: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

33

DebuggingDebugging

Single thread/process.– IDE’s with debugger most often sufficient.

Multiple clients, threads, distributed applications.– Synchronisation issues to protect the state of objects.– IDE’s (most often) lack good support.– Pre-instrumentation of code is often necessary.

Non-visual services (e.g. Real-time data conversions).– May debug single runs in IDE’s.– Hard to debug in real settings: system runs continuously or

discretely at fixed times

Page 34: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

34

Application Logging: What Application Logging: What and Why?and Why?

An application log is a text history of notable events logged by your application.

The logs helps you to figure out what went wrong (and right) during the execution of your application.

With the advent of N-tier architectures, Servlets, JSPs, and EJBs, application logging is particularly important to report errors that cannot or should not be surfaced to the user interface.

Page 35: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

35

JLog – Java Logging FrameworkJLog – Java Logging Framework

Developed by Todd Lauinger.A significant event happens in your Java code.

That event could be any of several different types and conditions. Before you start using a logging framework:– categorize and document your events so that all

users of the framework will log events consistently.

Page 36: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

36

System Event CategoriesSystem Event Categories

Levels:– CRITICAL_ERROR. (Highest - 1)– ERROR.– WARNING.– INFORMATION.– DETAIL.– TRACE. (Lowest - 6)

Page 37: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

37

Logging GranularityLogging Granularity

Agreed and documented set of event categories determine the granularity to log those events.

Separate logs for e.g.– thread pool.– SQL processor.

Page 38: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

38

Logging EventsLogging Events

Instrument code with logging statements: – AppLog.criticalError("Caught unexpected

exception: " + e);– SQLLog.info("Executing SQL query: " +

statement);– AppLog.trace("Entering method

getName()"); Notice: the code does not need to have any "if"

logic.

Page 39: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

39

Configuring the LogsConfiguring the Logs (1) (1)

Configuration from a properties file.LogFileExtension = log LogFilePath = c:\\temp\\ LoggingLevel = 2 LoggingMechanism = log.StandardErrLoggingMechanism LogFieldSeparator = |

Page 40: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

40

Configuring the LogsConfiguring the Logs (2) (2)

You may select the output logging level. Default is the INFO level.

All events logged at a level less than or equal to the log's current logging level will be output to the logging mechanisms.

Events logged at a numerically higher level (i.e., a less critical level) will be discarded.

Page 41: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

41

Configuring the LogsConfiguring the Logs (3) (3)

At runtime, you can increase or decrease the logging level of any of your logs without affecting your other logs.

If you are trying to debug a nasty problem with your thread pool, you can programmatically change the log at runtime :

ThreadLog.getInstance().setLoggingLevel(Log.TRACE_LEVEL);

Page 42: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

42

Configuring the LogsConfiguring the Logs (4) (4)

Other ways to dynamically reset the logging level at runtime:– In a debugger, you can change the value of the log's

currentLoggingLevel variable.– In an application server, you can examine and manipulate

log properties with some JSPs.– Use RMI to manipulate the log properties of a remote JVM.– There are more options you can configure both

programmatically and via a properties file.

Page 43: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

43

Reading the Logs (1)Reading the Logs (1)

Sample entries from a shared log, a vertical bar ( | ), is used to delimit the various fields of log entries:

RequestLog|L4|09:32:23:769|ExecuteThread-5|Executing request number 4

SQLLog|L4|09:32:23:835|ExecuteThread-5|select * from Customer where id = 35.

RequestLog|L4|09:32:23:969|ExecuteThread-5|Request 4 took 200 milliseconds.

Page 44: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

44

Reading the Logs (2)Reading the Logs (2)Import the log into a spreadsheet:

– ASCII text import with a vertical bar as a field delimiter.

– Sort or filter the log using various spreadsheet capabilities.

Page 45: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

45

Primary JLog Classes and Primary JLog Classes and RelationshipsRelationships

Page 46: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

46

OutlineOutline

Code quality and Code Standards.Code quality and Code Standards.Debugging, logging etc.Debugging, logging etc.Testing.

Page 47: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

47

TestingTesting

Not closely integrated with development prevents measurement of the progress of development - can't tell when something starts working or when something stops working.

JUnit to cheaply and incrementally build a test suite that helps to:– measure your progress,– spot unintended side effects.– focus your development efforts.

Page 48: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

48

JUnitJUnit

Automatic testing framework.– Acceptance tests.– Integration test.– Unit test.

Reports the number of defects graphically.May create many tests for each method.

Page 49: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

49

JUnit ExampleJUnit Example

Pay attention to the interplay of the code and the tests.– The style: to write a few lines of code, then a test

that should run, – or even better: to write a test that won't run, then

write the code that will make it run. The program presented solves the problem of

representing arithmetic with multiple currencies.

Page 50: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

50

Example: MoneyExample: Moneyclass Money {    

private int fAmount;    private String fCurrency;   public Money(int amount, String currency) {

  fAmount= amount fCurrency= currency;    

}    public int amount() {

return fAmount;     }    

public String currency() {    return fCurrency;     }}

Page 51: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

51

JJUUnitnit

JUnit defines how to structure your test cases and provides the tools to run them.

You implement a test in a subclass of TestCase.

Page 52: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

52

Example: MoneyExample: Money

public Money add(Money m) {

    return new Money(amount()+m.amount(), currency());

}

Page 53: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

53

JunitJunitDefine MoneyTest as a subclass of TestCase. Put MoneyTest in the same package as the

classes under test access to the package private methods. – Add method testSimpleAdd, that will exercise the

simple version of Money.add() above. – A JUnit test method is an ordinary method without

any parameters.

Page 54: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

54

Example: MoneyTestExample: MoneyTest

public class MoneyTest extends TestCase {    

//…    

public void testSimpleAdd() {        

Money m12CHF= new Money(12, "CHF");  // (1)

      Money m14CHF= new Money(14, "CHF");

      Money expected= new Money(26, "CHF");        

Money result= m12CHF.add(m14CHF);    // (2)

assert(expected.equals(result));     // (3)    

}

}

Page 55: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

55

Developing TestsDeveloping Tests

public void testEquals() {    

Money m12CHF= new Money(12, "CHF");

  Money m14CHF= new Money(14, "CHF");    

assert(!m12CHF.equals(null));

 assertEquals(m12CHF, m12CHF);

assertEquals(m12CHF, new Money(12, "CHF")); // (1)

assert(!m12CHF.equals(m14CHF));

}

Page 56: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

56

Developing TestsDeveloping Testspublic boolean equals(Object anObject) {

if (anObject instanceof Money) {      

   Money aMoney= (Money)anObject;        

return aMoney.currency().equals(currency())

  && amount() == aMoney.amount();    

}  

  return false;

}

Override the method hashCode whenever you override method equals.

Page 57: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

57

AssertionsAssertions

Verification in JUnit by calling assert which is inherited from TestCase. – Assert triggers a failure that is logged by JUnit when

the argument isn't true. – Since assertions for equality are very common,

TestCase defines an assertEquals convenience method. Logs the printed value of the two objects if they differ.

– Shows why a test failed in a JUnit test result report. Logged as a string representation created by toString.

Page 58: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

58

Test FixtureTest Fixture

public class MoneyTest extends TestCase {  

  private Money f12CHF;

private Money f14CHF;

  protected void setUp() {

     f12CHF= new Money(12, "CHF");

     f14CHF= new Money(14, "CHF");    

}

}

Page 59: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

59

Tests RefactoredTests Refactoredpublic void testEquals() {

  assert(!f12CHF.equals(null));

assertEquals(f12CHF, f12CHF);

  assertEquals(f12CHF, new Money(12, "CHF"));    

assert(!f12CHF.equals(f14CHF));

}

public void testSimpleAdd() {

  Money expected= new Money(26, "CHF");

  Money result= f12CHF.add(f14CHF);

  assert(expected.equals(result));

}

Page 60: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

60

Running of TestsRunning of Tests

Two additional steps are needed to run the two test cases:1. define how to run an individual test case,

2. define how to run a test suite.

JUnit supports two ways of running single tests:– static.– dynamic.

Page 61: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

61

Test Case: StaticTest Case: Static Overrides the runTest method inherited from TestCase and

call the desired test case. – Convenient way: anonymous inner class.– Note: each test must be given a name to identify it if it fails.

TestCase test = new MoneyTest("simple add") {    

public void runTest() {

      testSimpleAdd();    

}

};

– A template method in the super-class will make sure runTest is executed when the time comes.

Dynamic: TestCase test = new MoneyTest("testSimpleAdd");

Page 62: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

62

Test Suite: DynamicTest Suite: Dynamic

Illustration of the creation of a test suite with the dynamic way to run a test:– You only pass the class with the tests to a TestSuite

and it extracts the test methods automatically.

public static Test suite() {return new TestSuite(MoneyTest.class);

}

Page 63: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

63

Test Suite: StaticTest Suite: Staticpublic static Test suite() {     TestSuite suite= new TestSuite();  suite.addTest(new MoneyTest("money equals"){        protected void runTest() {

testEquals(); }        

}  );          suite.addTest(new MoneyTest("simple add") {        protected void runTest() {

testSimpleAdd(); }

    }     );     return suite; }

Page 64: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

64

Page 65: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

65

JUnit ReviewJUnit Review (1) (1)

In general: development will go much smoother writing tests a little at a time when developing.

When coding the imagination of how the code will work. Capture the thoughts in a test.

Test code is just like model code in working best if it is factored well.

Page 66: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

66

JUnit ReviewJUnit Review (2) (2)

Keeping old tests running is just as important as making new ones run.

The ideal is to always run all of your tests. When you are struck by an idea, defer thinking

about the implementation. First write the test. Then run it. Then work on the implementation.

Page 67: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

67

Testing PracticesTesting Practices (1) (1)

Martin Fowler: "Whenever you are tempted to type something into a print statement or a debugger expression, write it as a test instead.”

Only a fraction of the tests are actually useful. – Write tests that fail even though they should work,

or tests that succeed even though they should fail. – Think of it is in cost/benefit terms. You want tests

that pay you back with information.

Page 68: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

68

Testing PracticesTesting Practices (2) (2)

Receive a reasonable return on your testing investment: – During Development. – During Debugging.

Caution:– Once you get them running, make sure they stay running.

Ideally, run every test in the suite every time you change a method. Practically, the suite will soon grow too large to run all the time.

Page 69: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

69

Testing PracticesTesting Practices (3) (3)

Try to optimise your set-up code so you can run all the tests.

Or, – create special suites that contain all the tests that might

possibly be affected by your current development. – run the suite every time you compile. – make sure you run every test at least once a day: overnight,

during lunch, during one of those long meetings….

Page 70: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

70

ReferencesReferences

Code Complete; Steve McConnell, Microsoft Press.

The Elements of Java Style; Allan Vermeulen, SIGS Reference Library, Cambridge

http://www.javareport.com/ http://www.catapult-technologies.com/whitepapers/jlog/ http://www.junit.org/

Page 71: 1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen mailto:carlfrs@idi.ntnu.nomailto:carlfrs@idi.ntnu.no.

71

QuestionsQuestions