【问题标题】:Theory : starting Pex Exploration and number of PUT generated理论:开始 Pex 探索和生成的 PUT 数量
【发布时间】:2012-10-14 18:03:12
【问题描述】:

我阅读了很多关于 pex 的论文,我专注于探索策略。我知道 Fitnex 策略是默认使用的,但我不明白 Pex 如何创建第一个参数化单元测试。

我在哪里可以找到这些信息?

通过实验测试,我认为: - 如果参数是“int”,则从 0 开始 - 如果参数是“bool”,则以 false 开头 - 如果参数是一个以 Null 开头的对象

对吗?

现在关于 Fitnex 策略和求解器约束 Z3,我认为它只能通过迭代解决一个约束,对不起我的小英语现在我做一个例子:

假设有以下方法:

public void branchOverTests(bool a, bool b)
{
1   if (a)
    {
2       Console.WriteLine("B1");
    }
    else
    {
3       Console.WriteLine("B2");
    }
4   if (b)
    {
5       Console.WriteLine("B3");
    }
    else
    {
6       Console.WriteLine("B4");
    }
}

数字是行标识,Pex 生成 3 个测试:

--- Test 1
branchOverTests(a=false,b=false)
Path: 1F 3T 4F 6T
return target != (ClassMethod)null;
return target != (ClassMethod)null && a == false;
return target != (ClassMethod)null && a == false;
return target != (ClassMethod)null && a == false && b == false;

--- Test 2
branchOverTests(a=false,b=true)
Path: 1F 3T 4T 5T
return target != (ClassMethod)null;
return target != (ClassMethod)null && a == false;
return target != (ClassMethod)null && a == false;
return target != (ClassMethod)null && b != false && a == false;

Note: From Test 1 Flipped last branch: 
return target != (ClassMethod)null && a == false && b == false; 
-> return target != (ClassMethod)null && b != false && a == false; 
=> b = true

--- Test 3
branchOverTests(a=true,b=false)
Path: 1T 2T 4F 6T
return target != (ClassMethod)null;
return target != (ClassMethod)null && a != false;
return target != (ClassMethod)null && a != false;
return target != (ClassMethod)null && a != false && b == false;

Note: From Test 2 Resolve second condition of last branch:
return return target != (ClassMethod)null && b != false && a == false; 
-> return target != (ClassMethod)null && a != false && b == false; 
=> a = true
=> return target != (ClassMethod)null && a != false;
=> return target != (ClassMethod)null && a != false;

但最有效的参数化测试集是:

branchOverTests(a=false,b=false)
branchOverTests(a=true,b=true)

测试 1 之后:

return target != (ClassMethod)null && a == false;
-> return target != (ClassMethod)null && a != false;
=> a = true
=> return target != (ClassMethod)null && a != false && b != false;
=> b = true

理想测试 2:

branchOverTests(a=true,b=true)
Path: 1T 2T 4T 5T
return target != (ClassMethod)null;
return target != (ClassMethod)null && a != false;
return target != (ClassMethod)null && a != false;
return target != (ClassMethod)null && a != false && b != false;

我认为正确吗?

致以最诚挚的问候。

【问题讨论】:

    标签: performance pex


    【解决方案1】:

    Pex 始终以默认值开头,就像您描述的那样。这是第一个测试用例。然后 Pex 探索执行路径的所有可能组合。 (Fitnex 策略指导 Pex,但这对您的问题并不重要。)默认情况下,每当 Pex 发现增加分支覆盖率的新测试用例时,它都会发出另一个测试用例。 Pex 以这种方式渴望,并且不能保证生成的测试套件是最小的,正如您发现的那样。但通常它非常接近。 (在内部,Pex 最后也考虑了 (true,true),但没有创建另一个测试用例,因为它不会增加分支覆盖率。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多