2015-10-03 6 views
1

Я использую μJava для тестирования мутаций моей программы java. поскольку я изучаю тестирование мутаций.μJava Не убивает мутантов?

У меня есть 2 классов

1: Родитель

public class Parent 
{ 
public String temp; 
public int number; 

public Parent(String temp) 
{ 
    this.temp = temp; 
    this.number = 20; 
} 

public String printTemp() 
{  
    return "temp is : "+temp+number; 
} 
} 

и 2: Ребенок

public class Child extends Parent 
{ 
public int number; 

public Child(String temp) 
{ 
    super(temp); 
    this.number = 5; 
} 

public String printTemp() 
{ 
    String temp = "i am fake !"; 
    int number = 766; 
    return "temp is : "+super.temp+this.number+"c"; 
} 
} 

и я подаю операцию IOD из muJava. `следовательно, он порождает мутант. он удаляет переопределенный метод printTemp дочернего класса.

мой TestCase является:

public class MyTest 
{ 
    public String test1() 
     { 
     String result; 

    Parent p1 = new Parent("i am temp of parent"); 

     Child c1 = new Child("i am temp of child"); 

     Parent p2 = new Child("i am both !"); 

     result = ""+ c1.printTemp() + p1.printTemp() + p2.printTemp(); 

     return result; 
     } 
    } 

Но когда я бегу мутацию тестирования, я нашел мутант жил. Я хочу убить его! Что я могу сделать?

+0

Не знаю, что такое μJava, и я не вижу ничего в коде, который вы предоставили, который не является ванильной Java. В качестве примечания стороны: 'c1' также имеет тип' Parent', так как 'Child' является подклассом' Parent' – hotzst

ответ

1

MuJava переключил свою тестовую инфраструктуру на JUnit (см. https://cs.gmu.edu/~offutt/mujava/, раздел III.3). Это означает, что вы должны написать тест JUnit, который не только охватывает код, но также утверждает результат.

Пример:

@Test 
public void testPrintTempChild() { 
    Child c = new Child("Child"); 
    String actual = c.printTemp(); 
    String expected = "temp is : Child5c"; 
    assertEquals(expected, actual); 
} 

@Test 
public void testPrintTempParent() { 
    Parent p = new Parent("Parent"); 
    String actual = p.printTemp(); 
    String expected = "temp is : Parent20"; 
    assertEquals(expected, actual); 
} 

Если применить оператор мутации IOD, то первый тест должен обнаружить, что мутант (то есть, он должен не потому, что printTemp возвращает «Темп является: Child20»).

В качестве дополнительного комментария ссылка p2 в вашем тестовом коде также является экземпляром Child, поэтому c1.printTemp() и p2.printTemp() вызывают метод printTemp в вашем классе Child.

+0

Можете ли вы обосновать, почему мне нужно поставить assert? и что он на самом деле делает? – KrunalParmar

+0

Вызов assertEquals вызывает AssertionError (что приведет к сбою теста), если ожидаемое значение и фактическое значение отличаются. Вы можете взглянуть на [wiki] (https://github.com/junit-team/junit/wiki/Assertions) и [javadoc] (http://junit.org/apidocs/org/junit/Assert .html) для более подробной информации о методах утверждения JUnit. Имейте в виду, что общая цель состоит в том, чтобы сделать тест неудачным на мутанте. Таким образом, если ваш тест не содержит утверждения, которые проверяют фактический результат тестируемого метода, он может обнаруживать только мутант, если этот мутант вызывает неожиданное исключение. –