5

我有系统:

  • svn - 控制版本
  • cc.net - 作为 ci 服务器
  • msbuild - 作为构建系统
  • nunit - 用于启动测试
  • webdriver - 用于网络测试。

现在我的测试在每次提交后自动运行。但是如果提交有注释#runautotest(或其他),我希望我的测试运行。

我调查了 cc.net 的触发器,但它是为了另一个目标。我试图找到一些关于 cc.net 解析日志的信息,但这并没有积极的结果。

我应该使用什么样的方法来解决我的问题?

4

2 回答 2

3

在 ccnet 配置中,在项目中,在任务块的顶部:

<modificationWriter>
 <filename>svn_mods.xml</filename>
 <path>c:\modsdir</path>
</modificationWriter>

这会将 SVN 修改写入文件。

接下来在任务块中:

<nant>
 <executable>c:\path_to_nant</executable>
 <buildFile>mybuildfile.build</buildFile>
 <targetList>
  <target>conditionally_run_nunit_tests</target>
 </targetList>
</nant>

这将在 modifywriter 任务之后运行 Nant 任务。

conditionally_run_nunit_tests中,在文件c:\modsdir\svn_mods.xml中搜索#runautotest。如果找到它,请运行测试。如果你没有找到它,那么什么都不做。有多种方法可以解析 mods 文件。您可以使用 C# 脚本将整个文件读入一个字符串,然后调用包含传入#runautotest。

下面的代码是在 Nant 中使用 C# 脚本的示例。SearchFile 打开一个文件,将其读入字符串并检查字符串中是否有值。它返回“是”或“否”。以下脚本未经测试。

<property name="yesno" value="${ns::SearchFile("c:\modsdir\svn_mods.xml", "#runautotest")}"/>

<script language="c#" prefix="ns">
    <references>
        <include name="System"/>
        <include name="System.IO"/>
    </references>
    <code>
    <![CDATA[   
    [Function("SearchFile")]
    public static string SearchFile(string filepath, string token) 
    {
        System.IO.StreamReader myFile = new System.IO.StreamReader(filepath);
        string myString = myFile.ReadToEnd();
        myFile.Close();
        if(myString.Contains(token)) return "yes";
        else return "no";
    }               
    ]]>
    </code>
</script>
于 2012-05-02T19:04:53.037 回答
0

正如问题的赞成票所表明的那样,这似乎是一个更重要的问题。我会试一试:据我了解设置,CCNET 是包的领导者,监控 SVN 的源代码更改,获取源,触发 MSBuild 构建它们并触发 NUnit 和 WebDriver 执行单元和 Web 测试.

是否执行测试的决定取决于 SVN 修改注释中定义的主题标签。一方面是 SVN,另一方面是 NUnit 和 WebDriver 仅通过 CCNET 耦合。

所以首先我会保证这个包含评论的标签在 CCNET 的某个地方是可用的。我不是 SVN 专家,但我认为所有评论都在 CCNET 修改日志中。你能证实这一点吗?

接下来,测试的执行需要有条件。CCNET 的配置是一个相当静态的事情。随着CCNET 1.5中的DynamicValues和 CCNET 1.6 中的ConditionalTask ​​s 的出现,配置变得更加动态,您现在也可以在 CCNET 中进行控制流,但是由于我有点过时,我建议将测试执行包装在构建脚本中使用例如 MSBuild 或 NAnt 并将修改日志评估放在那里。

更新:看看亚当的回答。这个例子与我的想法非常接近(尽管我会使用<xmlpeek>而不是<script>)。

于 2012-05-01T11:06:56.443 回答