Министерство образования, науки, молодежи и спорта Украины
Одесский национальный политехнический университет
Институт компьютерных систем
Кафедра информационных систем
Лабораторная работа № 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;