2015-01-09 3 views
2

Я новичок в тестировании JUnit.Unit Testing Java

К примеру, у меня есть класс Разное в проекте:

public class Misc{ 

    public static int computeValue(int x,int y,int z) 
    { 
     int value = 0; 

     if((x==y)||(z==0)) 
      value = x+2; 

     else if(x>y) 
      value = y+4; 

     else 
      value = z; 

     return value; 
    } 
} 

Я дал ему попробовать в классе JUnit, но я не слишком уверен, что если бы я сделал это правильно.

public class MiscTest { 

@Test 
public void testXEqualToY() { 

    //Only X is equal to Y and z is not zero 
    int x = 5,y=5; 
    int value = 0; 
    value = Misc.computeValue(5, 5, 10); 
    assertEquals("test error",x,y,value); 
} 

@Test 
public void testZEqualZero(){ 
    //Only z is 0 
    int x=4,y=8,z=0; 

    int value = 0; 
    value = Misc.computeValue(11,5,0); 
    assertEquals("test error",z,value); 

} 

Что нужно поместить в тестовые примеры для проверки значений?

+0

Вы не уверены? Вы даже попробовали запустить его? – Adam

+5

Конечной проблемой может быть отсутствие документации интерфейса для метода getValue. Если бы вы знали, какую функцию он должен выполнять, вы можете проверить, делает ли он это, не беспокоясь об отдельных заявлениях. Я часто пишу документацию по интерфейсу и модульные тесты параллельно. Написание тестов выявляет отверстия в документации. Написание документации привлекает внимание к вещам, которые должны быть протестированы. –

ответ

1

Было бы неплохо использовать Parameterized. Parameterized действительно замечательно, когда вы хотите указать ожидаемый результат для множества различных входных событий.Вам нужно всего лишь один @Test здесь и может добавить новое условие проверки с простым добавлением { 0, 0, 0, 2 },

Теперь проверить каждый случай:

  • при х = у, ожидать X + 2
  • при г = 0 , ожидать х + 2
  • , когда х> у, ожидать у + 4
  • в противном случае, ожидать Z

здесь вы б Основныеоперации структура

@RunWith(Parameterized.class) 
class MyTest{ 

    @Parameters 
    public static Collection<Object[]> data() { 
      return Arrays.asList(new Object[][] { 
          { { 0, 0, 0, 2 },... }); 
    } 


    int x,y,z, expectedResult; 

    // add constructor here 

    @Test 
    public void testYEqualToZ(){ 
     int actualResult = Misc.computeValue(x,y,z); 
     assertEquals(actualResult, expectedResult); 
    } 
} 

Затем используйте следующие случаи тестирования:

  • 1, 1, 5, 3 // ху равный случай
  • 2, 2, 8, 4 // снова
  • 3, 6, 0, 5 г // 0 случай
  • 3, 2, 8, 6 // х> у случая
  • 3, 4, 8, 8 // х < у случая

Продолжайте добавлять случаи, пока вы не каждый возможный случай испытания

1


Способ, которым вы проектируете свой тест, нуждается в пересмотре. Вам нужно рассмотреть все случаи, которые вы хотите проверить. Для каждого случая вы должны определить ожидаемое значение и сравнить его с результатом вашей функции.
Например, я хотел бы рассмотреть 4 случая к испытанию:
- х == у
- г == 0
- х> у
- х < у
Я бы написать это

@Test 
public void testXEqualToY() { 
    //Only X is equal to Y and z is not zero 
    int x = 5,y=5; 
    int z=0; 
    int ref = 7; 
    assertEquals(ref, Misc.computeValue(x, y, z)); 
} 

@Test 
public void testYEqualToZ(){ 
    //Only z is 0 
    int x=4,y=8,z=0; 
    int ref = 6; 
    assertEquals(ref, Misc.computeValue(x, y, z)); 
} 
Etc... 

Таким образом, определение случаев проверки должно быть выполнено до написания кода, чтобы убедиться, что ваши тесты выдают то, что вы хотите достичь, а не то, что вы только что написали.

С уважением, Loic.

0

вы должны проверить все возможные исполнения потоков (проверить его с помощью инструмента покрытия). это проще всего сделать с помощью параметризованных тестов. в java есть много таких фреймворков. выберите тот, который обладает наилучшим соотношением мощности/простоты для вашего случая. например:

import static org.assertj.core.api.Assertions.assertThat; 
import org.junit.runner.RunWith; 
import com.googlecode.zohhak.api.TestWith; 
import com.googlecode.zohhak.api.runners.ZohhakRunner; 

@RunWith(ZohhakRunner.class) 
public class MyTest { 

    @TestWith({ 
     "5,5,0,  7", 
     "4,8,0,  6", 
     "11,5,0, 13" 
    }) 
    public void should_be_valid_point(int x, int y, int z, int expected) { 
     assertThat(Misc.computeValue(x, y, z)).isEqualTo(expected); 
    } 
}