【问题标题】:IronPython For Unit Testing over C#IronPython 用于 C# 上的单元测试
【发布时间】:2008-12-04 10:21:03
【问题描述】:

我们知道 Python 提供了比任何编译语言都高的生产力。我们用 C# 编程,需要用 C# 本身编写单元测试用例。如果我们看到我们为单元测试编写的代码量大约是原始代码的十倍。

使用 IronPython 而不是 C# 编写单元测试用例是理想的选择吗?有没有机构做过这样的事?我写了几个测试用例,它们似乎很好。但毛茸茸的尖尖经理不会接受。

【问题讨论】:

  • 它的 PHBoss .. 你的版本刚刚倾斜 :)
  • “毛茸茸的尖尖经理”是个好词!
  • 无论如何我们可以看看 IronPython 中的那些测试或演示测试!

标签: c# python unit-testing ironpython


【解决方案1】:

Python 非常适合对 C# 代码进行单元测试。我们的应用程序 75% 使用 Python,25% 使用 C#(Python.Net),我们的单元测试 100% 使用 Python。

我发现在 Python 中使用存根和模拟要容易得多,这可能是使人们能够编写有效的单元测试的最关键的组件之一。

【讨论】:

    【解决方案2】:

    Will 的回答很好 - 您正在为开发人员引入新要求。

    另外,工具支持是什么样的?我自己没有尝试过,但我想知道:

    • 调试失败的单元测试有多容易?
    • 从 IDE 运行单元测试有多容易? (例如,使用 ReSharper)
    • 从连续构建服务器自动化单元测试有多容易?

    可能所有这些都很好 - 但您应该检查它们并记录结果。

    当然,除了 IronPython,还有其他选项 - Boo 是一个相当明显的选择。

    【讨论】:

      【解决方案3】:

      Python 作为一种比 C# 简洁得多的语言,实际上可能会降低编写单元测试的门槛,因为仍然有很多开发人员通常拒绝进行自动化单元测试。引入并让他们使用像 IronPython 这样的语言,这种语言通常会花费更少的时间来用 C# 编写等效代码,实际上可能会鼓励编写更多的单元测试,这总是一件好事。

      另外,通过将 IronPython 用于您的测试代码,您最终可能会减少整个项目的代码行数 (LOC),这意味着您的单元测试更有可能在长期内得到维护而不是被忽略和/或丢弃。

      【讨论】:

        【解决方案4】:

        实际上,测试是尝试集成新语言的绝佳机会。像 Python 这样的语言在测试中表现得特别好,而且这是一个低风险的项目尝试 - 最坏的情况也不算太糟糕。

        就在 Python 中测试另一种语言的经验而言,我已经测试过类似的 C 和 C++ 系统,并且非常出色。我认为这绝对值得一试。

        尽管如此,Jon 说的是真的——Python 的工具水平,特别是 IronPython 的水平,远不及 C# 的水平。这对您的影响有多大,您会在您的试点项目中发现。

        【讨论】:

          【解决方案5】:

          有一个明显的缺点,那就是现在编写代码的每个人都需要精通两种语言,而不仅仅是一种。我毛茸茸的,但不是很尖刻,但我明白为什么经理们可能会持怀疑态度。

          【讨论】:

          • 我看不出 IronPython 在单元测试方面的得分如何超过 C#……以及生产力的提升将如何影响 OP 的整个团队……但这是一个团队的决定……如果每个人都同意并且好处是显而易见的......继续前进。
          • 嗯,大多数程序员不是已经习惯在工作中使用多种语言了吗? (例如,C#、SQL、JavaScript、HTML 等)我会更担心一个开发人员会雇佣只知道并使用一种语言的开发人员。
          【解决方案6】:

          在发现mbUnitNUnit 中的参数化测试后,我最近一直在重新评估我的测试态度。以前,由于测试的简洁性和可发现性,我推荐使用 Python unittest 作为自动化任何测试的方法。

          参数化测试允许您使用一系列数据参数自定义测试夹具,因此您的 C# 测试最终可以比 Python 测试更简洁。

          [TestCase(12, 3, 4)]
          [TestCase(12, 2, 6)]
          [TestCase(12, 4, 3)]
          [TestCase(12, 0, 0, ExpectedException = typeof(System.DivideByZeroException),
                TestName = “DivisionByZeroThrowsExceptionType”)]
          [TestCase(12, 0, 0, ExpectedExceptionName = “System.DivideByZeroException”,
                TestName = “DivisionByZeroThrowsNamedException”)]
          public void IntegerDivisionWithResultPassedToTest(int n, int d, int q)
          {
                Assert.AreEqual(q, n / d);
          }
          

          【讨论】:

            【解决方案7】:

            非常有趣。

            如果您使用 IronPython 编写所有代码(不仅仅是单元测试)会发生什么?你最终会减少大约 10 倍的代码吗?

            也许我也应该学习 IronPython。

            【讨论】:

            • C# 编译速度快,但 IronPython 通常有点慢。
            【解决方案8】:

            我要和威尔和乔恩一起去..

            我希望我的测试与我正在测试的代码使用相同的语言;它导致更少的认知上下文切换。但也许我只是不像以前那么灵活了。

            • 乔恩

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-05-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多