C# 单元测试这些方法?
您好,我想知道如何对以下方法进行单元测试:C# 单元测试这些方法?,c#,unit-testing,C#,Unit Testing,您好,我想知道如何对以下方法进行单元测试: 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;
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 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();
}
public float calcFTP()
{
浮点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=新的int[rowcount];
对于(int i=0;i
如果有人能给我举一些例子,那就太好了
基本上只需要对计算进行一些简单的测试在方法的当前状态下,您的单元测试将需要手动创建datagrid对象并根据您的测试场景填充值。正如Daniel所建议的,您的方法“public float calcNP()”不应使用数据网格,而可以将整数数组传递给该方法(仅传递将在计算中使用的值)我们告诉您这样做:
// 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);
}
顺便说一句:
sut
代表“正在测试的系统”.您将很难使用依赖于数据网格中的值的单元测试方法。请将计算逻辑移动到单独的方法中,这些方法以数字作为输入,不引用数据网格,然后对这些方法进行单元测试。@user2913240编写好的单元测试需要投入时间和重构代码以支持良好的测试实践ces.BJ Myers告诉了您一种进行重构的好方法。您当前编写的方法依赖于您要测试的方法范围之外的状态。这使得测试变得很困难。单元测试就是要验证对于特定的输入集,您是否会收到特定的输出集。尝试测试依赖于UI的代码元素将花费比将逻辑重构成单独的方法并进行测试更长的时间。关于“将计算逻辑移动到单独的方法中,将数字作为输入,不引用数据网格,然后对这些方法进行单元测试”这句话,还有什么不清楚的?@user2913240,如果你不愿意接受指导,问一个问题有什么意义?在当前状态下,你的代码是不可测试的。
// 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);
}
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);
}