TDD代码覆盖状态

时间:2015-02-10 16:11:23

标签: c# unit-testing tdd code-coverage

我项目的整体代码覆盖率为72.86%,其中106个测试用例失败,1个跳过测试用例,925个测试用例通过。共有1032个测试用例。覆盖范围内有4个子覆盖范围:

  1. BusinessLogic.dll:67.72%
  2. datalogic.dll:18.83%
  3. dataobject.dll:50.00%
  4. testbusinesslogic.dll:86.01%
  5. 我只知道testbusinesslogic.dll,并让测试通过。 我不知道其余的(Business.dll / datalogic.dll / dataobject.dll),因为我无法调试该方法。

    1. 如何提高该区域代码覆盖率?
    2. 我可以在那里编辑代码吗?
    3. 我应该怎么做才能通过考试?
    4. 或者其他106个测试用例仅在" testbusinesslogic.dll"?
    5. 如果我通过了所有测试用例,那么3个子代码覆盖率是否会增加? (如果测试用例仅在testbusinesslogic.dll中)
    6. 这是我第一次做TDD。

      以下是datalogic.dll文件中的一种方法,此方法未出现在我的失败/传递/跳过的测试用例中。这意味着什么?为什么这部分的代码覆盖率会如此之低?如何增加datalogic.dll部分的代码覆盖率?因为我没有失败的测试用例允许我像testbusinesslogic.dll一样通过

      public void GetModelDataForCreate(DataSet availabilityDataSet, int resourceID)
          {
      
              Database db = WindowsApplicationTemplate.ApplicationDatabase.DatabaseFactory.CreateDatabase();
      
              string sqlProcedure = "uspAvailabilityGetModelDataForCreate";
              DbCommand dbCommand = db.GetStoredProcCommand(sqlProcedure);
              UtilityDL.SetCommandTimeout(dbCommand);
              db.AddInParameter(dbCommand, "resourceID", DbType.Int32, resourceID);
      
              string[] tables = new string[] { "EventType", "LaborCategory", "Event", "IntelTime", "DurationType", "Resource", "ParameterInfo" };
      
              availabilityDataSet.Clear();
      
              // RETRIEVE DATA FROM DB AND LOAD INTO DATASET
              db.LoadDataSet(dbCommand, availabilityDataSet, tables);
      
          }
      

2 个答案:

答案 0 :(得分:6)

所以,首先要做的事情是:你没有正确地做TDD。在TDD中,一次只能有一个失败的测试 - 你正在为其编写代码。

(当你遇到重新分解的狂热点并引入新的缺陷时,可能会有其他人,但这些是很快就能解决的急性事件。)

这是TDD的副作用,而不是目标。您使用的过程以及您在TDD中执行的操作会导致这种状态。

TDD是一项学到的技巧。教程会让你开始,但要熟练需要大量的练习。但是不要灰心!如果你在实际工作中这样做,开发TDD专业知识是非常愉快的。用于说明TDD的人为设想的例子是可以预见的无聊和无用的,经常是错误的。

接下来,关于测试覆盖率,您不希望在总数中包含testbusinesslogic。您可以使用特定于测试工具的属性来排除整个DLL。对于MSTest,信息位于排除/包含部分的https://msdn.microsoft.com/en-us/library/jj159530.aspx

此外,许多失败的测试可以在测试失败时降低代码覆盖率,因为在测试代码中抛出异常,这导致在测试期间永远不会执行以下代码。如果您有很多这些,可能是您的测试设置不正确。

最后,除非您可以编辑DLL中的代码,否则您将无法获得成功。测试的目的是纠正缺陷。测试你无法触及的代码是没用的。

答案 1 :(得分:0)

测试覆盖率报告在运行测试时正在执行的代码量。

你的测试程序集testbusinesslogic.dll的覆盖范围是无关紧要的(但我觉得很奇怪它并不是真的接近100%,可能会考虑为什么会出现这种情况)。可能是一个好的指标是你的其他(生产)组件的覆盖率。

如果要为这些生产程序集获得更高的覆盖率,则需要在testbusinesslogic.dll中编写更多测试,以便在那里执行未覆盖的代码。这是获得测试覆盖率的唯一方法。

注意:单元测试"只是为了增加代码覆盖率"通常是一个坏主意。编写测试以获得安全网,回归测试,驱动设计或其他任何东西。但是编写测试只是为了获得一些任意的百分比,几乎没有任何好处。

正如Keith Payne所说,您可能正在进行测试优先开发(您的单元测试存在于生产代码之前),但您并未真正进行测试 - 驱动开发。