2015-05-09 3 views
-1

Привет Мне было интересно, как я могу проверить блок методы ниже:Единица Проверьте эти методы?

public float calcNP() 
    { 

     int rowcount = dataGridView1.Rows.Count; 

     int[] colB = new int[rowcount]; 
     float[] NP = new float[rowcount]; 
     float avgNP = 0; 
     for (int i = 0; i < rowcount; i++) 
     { 
      colB[i] = Convert.ToInt32(dataGridView1.Rows[i].Cells[5].Value); 


     } 

     float min = colB.Min(); 
     float max = colB.Max(); 
     float a = 1, b = 10; 

     for (int i = 0; i < rowcount; i++) 
     { 
      NP[i] = (a + (colB[i] - min) * (b - a))/(max - min); 
      avgNP = NP[i] + avgNP; 



     } 

     avgNP = (avgNP/rowcount) * 100; 
     return avgNP; 
    } 

, а также следующие

public float calcIFact() 
    { 

     float ftp = calcFTP(); 
     float NP = calcNP(); 
     float IntFact = NP/ftp; 

     return IntFact; 


    } 

и этот

public float calcFTP() 
    { 

     float ftp = 0; 

     if (chkFTP.Checked == true) 
     { 
      // ftp =(float)Convert.ToDouble(txtFTP.Text)/100; 
      ftp = (float)Convert.ToDouble(txtFTP.Text); 

     } 

     if (chkFTP.Checked == false) 
     { 
      int rowcount = dataGridView1.Rows.Count; 

      int[] colB = new int[rowcount]; 


      for (int i = 0; i < rowcount; i++) 
      { 
       colB[i] = Convert.ToInt32(dataGridView1.Rows[i].Cells[5].Value); 


      } 
      // ftp = colB.Max()/100; 

      ftp = colB.Max(); 
     } 

Если кто-то может дать мне несколько примеров, было бы замечательно.

В основном просто нужно несколько простых тестов для расчетов

+12

У вас будут жесткие методы тестирования единицы измерения, которые зависят от значений в сетке данных. Переместите логику расчета в отдельные методы, которые принимают числа в качестве входных данных и не ссылаются на сетку данных, а затем проверяют эти методы. –

+0

Хорошо, у вас мало времени, чтобы поиграть с ним просто нужно создать несколько тестов для проекта в целом. Насколько сложно было бы тестировать некоторые функции диаграммы? – mvoase

+3

@ user2913240 Для написания хороших модульных тестов требуется время инвестирования и код рефакторинга для поддержки хороших методов тестирования. BJ Майерс сказал вам хороший способ приблизиться к рефакторингу. Ваш метод, который в настоящее время написан, опирается на состояние из-за пределов метода, который вы хотите проверить. Это затрудняет тестирование. Тестирование модулей - это проверка того, что для определенного набора входов вы получаете обратно определенный набор выходов. –

ответ

0

В текущем состоянии метода, ваши модульные тесты собираются требовать вручную создать DataGrid объект и заполнить значения в соответствии с вашим сценарием тестирования. Как предложил Даниэль, ваш метод «public float calcNP()» не должен использовать сетку данных, вместо этого вы можете передать массив методу в метод (передать только значения, которые вы собираетесь использовать при расчете)

2

Мы говорим вам, чтобы сделать это:

// New method, not depending on a gridview. Testable. 
public float calcNP_pure(int[] colB) 
{ 
    float[] NP = new float[colB.Length]; 
    float avgNP = 0; 

    float min = colB.Min(); 
    float max = colB.Max(); 
    float a = 1, b = 10; 

    for (int i = 0; i < rowcount; i++) 
    { 
     NP[i] = (a + (colB[i] - min) * (b - a))/(max - min); 
     avgNP = NP[i] + avgNP; 
    } 

    avgNP = (avgNP/rowcount) * 100; 
    return avgNP; 
} 

// Not testable 
public float calcNP() 
{ 
    int rowcount = dataGridView1.Rows.Count; 
    int[] colB = new int[rowcount]; 
    for (int i = 0; i < rowcount; i++) 
    { 
     colB[i] = Convert.ToInt32(dataGridView1.Rows[i].Cells[5].Value); 
    } 
    return calcNP_pure(colB); 
} 

Этот новый метод также должен перейти в новый класс, а не сидеть на форме или каким-либо другим UI-элемента. Лучше всего программировать на интерфейсы и вводить необходимые зависимости в объекты:

public interface INpCalculator 
{ 
    float CalcNP(int[] values); 
} 

public class NpCalculator : INpCalculator 
{ 
    public float CalcNP(int[] values) 
    { 
     ... 
     return ...; 
    } 
} 

public partial class Form1 : Form 
{ 
    private INpCalculator _npCalculator; 

    public Form1(INpCalculator npCalculator) 
    { 
     InitializeComponent(); 
     _npCalculator = npCalculator; 
    } 

    private float CalcNP() 
    { 
     int[] colB = dataGridView1.Rows 
      .Cast<DataGridViewRow>() 
      .Select(row => row.Cells[5].Value) 
      .ToArray(); 
     return _npCalculator.CalcNP(colB); 
    } 
} 

Теперь калькулятор проверяемый без необходимости открывать любую форму:

[TestMethod] 
public void TestNpCalculator() 
{ 
    // Arrange 
    var sut = new NpCalculator(); 
    var values = new int[] { 12, 7, 15, 3 }; 

    // Act 
    float result = sut.CalcNP(values); 


    // Assert 
    Assert.AreEqual(123.456f, result); 
} 

Btw: sut выступает за " система под контролем ".

Смежные вопросы