Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
13
Добавлен:
10.02.2016
Размер:
51.59 Кб
Скачать

Министерство образования, науки, молодежи и спорта Украины

Одесский национальный политехнический университет

Институт компьютерных систем

Кафедра информационных систем

Лабораторная работа № 1

По дисциплине: «Качество и надёжность»

На тему: «Разработка модульных тестов»

Выполнил:

ст. гр. АИ-091

Подкошин А.С.

Проверил:

Трофимов Б.Ф.

Одесса, 2013

Цель работы: для заданной задачи реализовать набор модульных тестов, обеспечивающих 100% покрытие кода.

При этом необходимо учитывать следующие моменты:

  • НЕОБХОДИМО использовать Maven + Junit.

  • Реализация задания должна быть хорошо изолирована в виде отдельного класса(ов), с четкими входными и выходными параметрами. Реализация задача непосредственно в UI недопустима.

  • Для каждой конструкции условия/цикла должен существовать тест, при котором эта конструкция как выполняется так и не выполняется (где это возможно).

  • Для каждой значимой группы входных параметров должны существовать тесты, например:

  • Обычные корректные параметры, т.е. параметры при которых задача решается в штатном режиме.

  • Пустые параметры (напр. пустые массивы)

  • Граничные параметры, например для сортировки уже отсортированный массив, так и массив, отсортированный в обратном порядке.

  • Некорректные параметры. Реализация в этом случае должна вести себя корректно (возвращать код ошибку или генерировать исключение)

  • Предпочтительным языком реализации задания является Java с помощью системы сборки Maven и библиотеки запуска модульных тестов JUnit.

Задание: Дана квадратная целочисленная матрица. Найти столбец, на котором находится максимальный элемент. Заменить все элементы этого столбца на минимальный из соответствующих элементов главной и побочной диагоналей.

Текст программы:

Класс Main

package laba1.presentation;

import laba1.computation.Compute;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {

public static void main(String[] args) {

ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");

Compute obj=(Compute) context.getBean("MatrixComputation");

int[][] m=obj.changeMaxColumn(new int[][]{{-1,2,-1},

{-4,5,-4},

{-7,-8,7}});

for (int i=0;i<m.length;i++){

for (int j=0;j<m.length;j++){

System.out.print(m[i][j]+" ");

}

System.out.println();

}

}

}

Интерфейс Compute

package computation;

public interface Compute {

public int[][] changeMaxColumn(int[][] matrix);

}

Класс MatrixComputation

package laba1.computation;

public class MatrixComputation implements Compute{

public int[][] changeMaxColumn(int[][] matrix) {

int size=matrix.length;

int col=getMaxColumnNumber(matrix);

int minDiag[]=getDiagonalMinElements(matrix);

for (int i=0;i<size;i++){

matrix[i][col]=minDiag[i];

}

return matrix;

}

private int getMaxColumnNumber(int[][] mat){

int size=mat.length;

int max=-999999;

int index=-1;

for (int i=0;i<size;i++){

for (int j=0;j<size;j++){

if (mat[i][j]>max){

max=mat[i][j];

index=j;

}

}

}

return index;

}

private int[] getDiagonalMinElements(int[][] mat){

int size=mat.length;

int[] ret=new int[size];

for (int i=0;i<size;i++){

int min=999999999;

if (mat[i][i]<min){

min=mat[i][i];

}

if(mat[i][size-i-1]<min){

min=mat[i][size-i-1];

}

ret[i]=min;

}

return ret;

}

}

Класс TestJUnit

package laba1;

Import laba1.Computation.Compute;

import org.junit.Assert;

import org.junit.Test;

Import org.Springframework.Context.ApplicationContext;

Import org.Springframework.Context.Support.ClassPathXmlApplicationContext;

import static org.junit.Assert.*;

public class TestJUnit {

ApplicationContext context;

public TestJUnit() {

context = new ClassPathXmlApplicationContext("Beans.xml");

}

// Тестирование с обычными параметрами

@Test

public void testNormalConditions(){

Compute obj=init();

Assert.assertArrayEquals("Arrays are not equal",

obj.changeMaxColumn(new int[][]{{1,2,3},

{4,5,6},

{7,8,9}}),

new int[][]{{1,2,1},

{4,5,5},

{7,8,7}});

}

// Тестирование с одинаковыми диагональными элементами

@Test

public void testDiagonalElements(){

Compute obj=init();

Assert.assertArrayEquals("Arrays are not equal",

obj.changeMaxColumn(new int[][]{{1,2,1},

{4,5,4},

{7,8,7}}),

new int[][]{{1,1,1},

{4,5,4},

{7,7,7}});

}

// Тестирование с пустой матрицей

@Test

public void testEmptyMatrix(){

Compute obj=init();

Assert.assertArrayEquals("Arrays are not equal",

obj.changeMaxColumn(new int[][]{}),new int[][]{});

}

// Тестирование с отрицательными значениями

@Test

public void testNegativeValues(){

Compute obj=init();

Assert.assertArrayEquals("Arrays are not equal",

obj.changeMaxColumn(new int[][]{{-1,2,-1},

{-4,5,-4},

{-7,-8,7}}),

new int[][]{{-1,2,-1},

{-4,5,5},

{-7,-8,-7}});

}

// Тестирование с несколькими одинаковыми максимальными элементами

@Test

public void testMultipleEqualMaxValues(){

Compute obj=init();

Assert.assertArrayEquals("Arrays are not equal",

obj.changeMaxColumn(new int[][]{{1,2,3},

{4,5,6},

{7,0,7}}),

new int[][]{{1,2,3},

{5,5,6},

{7,0,7}});

}

protected Compute init(){

return((Compute) context.getBean("MatrixComputation"));

}

}

Вторая часть

Сущность для хранения базы данных: некоторый несовершенный платёж.

Функция выполнения:

Прибавить к имени сущности слово “_З” для тех сущностей, у которых имя начинается на “E”.

Выбрать список сущностей по пользовательскому критерию (на свой выбор).

База данных: SQLite

Интерфейс для работы с базой данных: ORM Hibernate

Приложение должно содержать следующие слои и компоненты

Слои.

Слой представления (вывод/ввод результатов на консоль пользователю)

Слой Application Services. Здесь должны быть реализованы функции выполнения.

Слой домена. Здесь находится определение сущности и репозитария.

Каждый слой должен быть упакован в своем package.

При этом должны быть задействованы следующие компоненты:

1. ApplicationService - компонент в котором выполняются функция выполнения. Находится в слое Application Services. В этой компоненте запрещается использовать вывод или ввод в консоль, любые взаимодействия осуществлять через входные/выходные параметры. Все взаимодействия с БД должны быть осуществлены через соответствующие методы репозитория!

2. Repository - компонент, инкапсулирующий работу с базой данных в виде CRUD операций (CREATE, REFRESH, UPDATE,DELETE)

Dependency Injection должен склеивать все компоненты воедино. При разработке компонент необходимо выставить scope равным Singleton.

Класс Payment

package laba2.domain;

import java.sql.Date;

public class Payment {

private int id;

private String name;

private String surname;

private Date date;

private float amount;

private String currency;

public void setId(int id){ this.id=id; }

public void setName(String name){ this.name=name; }

public void setSurname(String surname){ this.surname=surname; }

public void setDate(Date date){ this.date=date; }

public void setAmount(float amount){ this.amount=amount; }

public void setCurrency(String currency){ this.currency=currency; }

public int getId(){ return this.id; }

public String getName(){ return this.name; }

public String getSurname(){ return this.surname; }

public Date getDate(){ return this.date; }

public float getAmount(){ return this.amount; }

public String getCurrency(){ return this.currency; }

}

Класс PaymentsRepositoryImpl

package laba2.domain;

import java.sql.Date;

import java.util.Iterator;

import java.util.List;

import org.hibernate.HibernateException;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.Transaction;

import org.hibernate.cfg.Configuration;

import org.springframework.beans.factory.annotation.Autowired;

public class PaymentsRepositoryImpl implements PaymentsRepository{

@Autowired

private SessionFactory factory;

public PaymentsRepositoryImpl() {

try{

factory = new Configuration().configure().buildSessionFactory();

}catch (Throwable ex) {

System.err.println("Failed to create sessionFactory object." + ex);

throw new ExceptionInInitializerError(ex);

}

}

public Payment getPayment(int id) {

Session session = factory.openSession();

Transaction tx = null;

try{

tx = session.beginTransaction();

Payment pay = (Payment) session.get(Payment.class,id);

tx.commit();

return pay;

} catch (HibernateException e) {

if (tx!=null) tx.rollback();

e.printStackTrace();

}finally {

session.close();

}

return null;

}

/** обновить плательщика */

public void updatePayment(Payment p) {

Session session = factory.openSession();

Transaction tx = null;

try{

tx = session.beginTransaction();

session.update(p);

tx.commit();

} catch (HibernateException e) {

if (tx!=null) tx.rollback();

e.printStackTrace();

}finally {

session.close();

}

}

public void editPayment(int id, float editAmount) {

Session session = factory.openSession();

Transaction tx = null;

try{

tx = session.beginTransaction();

Payment pay=(Payment) session.get(Payment.class, id);

pay.setAmount(editAmount);

session.update(pay);

tx.commit();

} catch (HibernateException e) {

if (tx!=null) tx.rollback();

e.printStackTrace();

}finally {

session.close();

}

}

public void removePayment(int id) {

Session session = factory.openSession();

Transaction tx = null;

try{

tx = session.beginTransaction();

Payment pay=(Payment) session.get(Payment.class, id);

session.delete(pay);

tx.commit();

} catch (HibernateException e) {

if (tx!=null) tx.rollback();

e.printStackTrace();

}finally {

session.close();

}

}

/** получить список всех платежей */

public List<Payment> getAllPayments() {

Session session = factory.openSession();

Transaction tx = null;

try{

tx = session.beginTransaction();

List<Payment> payments = session.createQuery("FROM Payment").list();

for (Iterator iterator =

payments.iterator(); iterator.hasNext();){

Payment pay = (Payment) iterator.next();

System.out.print("First Name: " + pay.getName());

System.out.print(" Last Name: " + pay.getSurname());

System.out.println(" Salary: " + pay.getAmount());

}

tx.commit();

return(payments);

}catch (HibernateException e) {

if (tx!=null) tx.rollback();

e.printStackTrace();

}finally {

session.close();

}

return null;

}

}

Класс Main

package laba2.presentation;

import java.sql.Date;

import java.util.Iterator;

import java.util.List;

import laba2.application.ApplicationService;

import laba2.domain.Payment;

import laba2.domain.PaymentsRepository;

import laba2.domain.PaymentsRepositoryImpl;

import org.apache.log4j.Logger;

import org.springframework.beans.factory.annotation.Autowired;

Соседние файлы в папке Трофимов