代码之家  ›  专栏  ›  技术社区  ›  Daenyth

为项目进行单元测试

  •  5
  • Daenyth  · 技术社区  · 14 年前

    我开始研究projecteuler中的问题,我想用TDD风格来处理它,但是我很难找到不包含代码的问题的数字答案。是否有任何资源与数据,以便我可以作出测试用例,将告诉我,如果我已经解决了问题正确?

    怎样 解决问题。

    编辑:我正在寻找没有上下文或算法的答案的数字,这样我就可以做如下的事情。我知道它更冗长,但我希望能够有一个通过/失败的结果来告诉我我的算法是否正确,而不是看别人的代码示例来知道我是否做得正确。

    import unittest
    class ProblemOneTest(unittest.TestCase):
        def test_me(self):
            self.assertEquals(solve_problem_one(),233168)
    
    if __name__ == '__main__':
        print "Problem 1 possible answer: %d" % solve_problem_one()
        sys.exit(unittest.main())
    
    7 回复  |  直到 10 年前
        1
  •  11
  •   Eli Bendersky    14 年前

    TDD和projecteuler分配不一定很好地结合在一起。首先也是最重要的,TDD不会帮助您解决任何项目Euler(PE)问题。这让我想起了一个众所周知的尝试,一个家伙试图通过 using TDD .

    TDD不是一种设计技术。如果适用的话,它可能非常有用,但不要把它看作是一颗灵丹妙药。

    一个PE问题通常涉及到一些以一个数字结束的繁重计算,这就是答案。要有意识地应用TDD,我建议你将它用于数学实用程序,作为你解决体育问题努力的一部分。例如,MyUtils模块For PE包含用于计算素数、将数字拆分为数字、检查回文等的函数。此模块有一组测试,因为这些函数 一般的 足够测试了。PE解决方案本身没有测试——他们唯一需要的真正测试是最终生成正确答案。

        2
  •  4
  •   Daenyth    14 年前

    欧拉项目网站上的问题页面有一个输入来检查你的答案。这就是我真正需要的。

        3
  •  2
  •   Frank V    14 年前

    是的,您可以根据单元测试提供的测试数据设置单元测试。

    assert '针对示例数据的语句。它工作得很好,而且时间开销较少。此外,当您只需要知道问题30的新更改是否正确时,不需要运行整个测试套件。

    Using Assertions Effectively

        4
  •  1
  •   Dominic Bou-Samra    14 年前

    单元测试就是答案。

    这些问题通常非常简单(不是从难度上来说,而是至少从代码布局上来说),将它们分解成各种方法/类通常是愚蠢的。

        5
  •  1
  •   chucksmash    11 年前

    我知道我迟到了3年,但我想我会分享我是如何通过TDD接近欧拉项目。

    我在用Python工作,如果这对你很重要的话。

    我要做的是:

    • 每一个问题(至少)都有自己的功能作为一个入口/出口,无论它感觉多么琐碎或愚蠢。如果问题需要某种您认为将来可能需要的功能,那么问题也可能得到帮助函数。
    • 计划用一个参数来设置你的入口/出口函数,这个参数允许这个函数同时解决玩具版本的问题和更难的全尺寸版本的问题。例如,在 problem 12
    • 现在我还没有实现这个函数,只是给它命名。现在我将为这个问题编写两个测试:test\u example和test\u problem。我会用你的问题来解决的 @unittest.skip('Unimplemented') 现在我们还不知道答案。您的测试文件可能与我的类似:

      import unittest
      
      from problems.p0014 import get_triangle_num_with_n_or_more_divisors
      
      class TestHighlyDivisibleTriangleNumber(unittest.TestCase):
          def test_example(self):
              self.assertEquals(get_triangle_num_with_n_or_more_divisors(1),
                                1)
              self.assertEquals(get_triangle_num_with_n_or_more_divisors(2),
                                3)
              self.assertEquals(get_triangle_num_with_n_or_more_divisors(6),
                                28)
      
          @unittest.skip('Unimplemented')
          def test_problem(self):
              self.assertEquals(get_triangle_num_with_n_or_more_divisors(500),
                                'TODO: Replace this with answer')
      

    然后我坐下来,写下一个或多个除数的三角数。一旦测试通过,我就会努力解决真正的问题;如果可行的话,我会用真实答案更新我的测试题 巴姆

        7
  •  0
  •   user    8 年前

    我想分享一下我的方法:

    Project Euler section ,遵循TDD范式。它使用 测试用例。它们提供了一个示例测试用例来帮助您开始。我离线开发并编写一些其他测试用例来验证我的解决方案,以获得更快更精确的反馈。

    JavaScript测试示例:

    var cases = [
      {input: '1\n15', output: '45'},
      ...
    ];
    
    describe('Multiples of 3 and 5', function() {
      cases.forEach((v, i) => {
        it('test case #' + i, function () {
          assert.equal(unit(v.input), v.output);
        })
      });
    });
    

    虽然Hackerrank使用stdin和stdout,但我仍然尝试将主代码隔离到函数中,并使用函数式编程。