Test

Advanced Programming

SUT • Spring 2019

Review

  • Java Programming Language

  • Principles of Object Oriented Programming

    • Characteristics of objects

    • Encapsulation

  • Objects in memory

    • References

    • Heap

    • Stack

  • Parameter Passing

Review

  • Initialization and Cleanup
    • Constructor
    • finalize()
    • Order of initialization
      • Initialization blocks
  • Access specifiers
    • Public
    • Private
    • Package access

Review

  • Package
  • Static
  • The this reference
  • Method overloading
  • toString()
  • equals()
  • Refactoring
    • Bad smells
    • Refactoring techniques

Agenda

  • Software Quality

  • Characteristic of a good software

  • Test

  • Unit Testing

  • Refactoring

Software Quality

Quality of Product

  • The producer should ensure about the quality of the products

  • Quality Control

  • Any business, any product

A Cook

In surgery

A Car Maker

Quality Control

  • Quality should be tested
  • A product is not finalized, before the test
  • Different kinds of test, check different kinds of quality

Software Quality

  • We are programmers
  • Programmers produce software
  • What are characteristics of a good software?
  • Many parameters. E.g.
    • Conformance to requirements
    • Performance
      • Time
      • Memory
    • Maintainability
      • Changeability
  • Different kinds of test, check different kinds of quality

Test in Other Industries

  • Test side effects
  • A damage to the product
    • Test of a building
    • Test of a car
    • Test of a part of a product

Test Side Effects

What to do with Test Side Effects?

  • Testing a sample of the product
  • Simulation
  • Mathematical analysis
  •  
  • In software testing
    • Along with all of these techniques
    • And we can also test the software itself!
    • (Usually) no damage to the software

Test Target

  • System Test
    • Test the system as a whole
    • For performance, correctness and conformance.
  • Unit Test
    • Test the units and modules
    • Test of a component
    • Test of a class
    • Test of a method

How to Test Software

  • Manual Test
    • Try it!
  • Test Tools
    • Performance Test
    • Profiling
      • JProfiler, TPTP
    • Load Test
      • Jmeter
    • Test Code
      • Unit Tests
    • Test Teams

Test Code

  • Business Code
    • The code, written for implementation of a requirement
       
  • Test Code
    • The code, written for test of an implementation

Unit Testing

  • A process for the programmer
    • Not a test team procedure
    • For improving the code quality
    • Reduces bugs
  • Test of units of software
    • before the software is completed
    • Unit: method, class

Classical Unit Testing

  • Writing main() method
  • Some printlns
  • Drawbacks?

Drawbacks

  • Test code coupled with business code
    • In the same class
  • Written tests are discarded
  • One test at a time
  • The programmer executes the tests himself
    • Test execution is not automatic
  • The programmer should check the result of each test himself
    • The test is passed or failed?
    • The test result interpretation is not automatic

A Good Unit Test Code

  • Repeatable
  • Automatic
    • Invocation
    • Acceptance (Pass/Failure)
  • JUnit helps you write such tests

JUnit, First Example

public class BusinessTest extends TestCase {
    public void testSort(){
        int[] list = {3, 2, 5, 7, 6, 1, 3};
        Business.sort(list);

        int[] sortedList = {1, 2, 3, 3, 5, 6, 7};
        for (int i = 0; i < sortedList.length; i++){
            assertEquals(list[i], sortedlist[i]);
        }
    }
}

JUnit, The Green Bar

What is the output of:

public class Testing {
    @Test
    public void testNormal() {
        int[] array = {3, 2, 1, 4};
        int[] sorted = {1, 2, 3, 4};
        Business.sort(array);
        for (int i = 0; i < sorted.length; i++) {
            Assert.assertEquals(sorted[i], array[i]);
        }
    }

    @Test
    public void testEmptyArray() {
        int[] array = {};
        try {
            Business.sort(array);
        } catch (Exception e) {
            Assert.fail();
        }
        Assert.assertEquals(array.length, 0);
    }
}

Assertions

  • assertNull(x)
  • assertNotNull(x)
  • assertTrue(boolean x)
  • assertFalse(boolean x)
  • assertEquals(x, y)
    • Uses x.equals(y)
  • assertSame(x, y)
    • Uses x ==y
  • assertNotSame
  • fail()

Annotations

  • @Test
  • @Before
  • @After
  • @BeforeClass
  • @AfterClass

What is the output of:

@Test
public void theTestMax() {
    System.out.println(" testMax()");
    assertEquals(Business.max(list), 7);
}

@Test
public void theTestMin() {
    System.out.println(" testMin()");
    assertEquals(Business.min(list), 1);
}


@Before
public void theTestMax() {
    System.out.println(" setUp()");
}

@After
public void theTestMax() {
    System.out.println(" tearDown()\n");
}


A Good Unit Test is

  • Automated
  • Through
  • Repeatable
  • Independence
  • Professional

Test Driven Development

  • Test First Development
  • Before writing a code, write the tests!

TDD

Title Text

Test

By Behnam Hatami

Test

Test / Advanced Programming Course @ SUT, Spring 2019

  • 985