Goh*_*ohu 69 python unit-testing python-unittest
我有一个测试文件,其中包含花费大量时间的测试(它们将计算发送到集群并等待结果).所有这些都在特定的TestCase类中.
由于它们需要时间而且不太可能破坏,我希望能够选择这个测试子集是否运行(最好的方式是使用命令行参数,即" ./tests.py --offline"或者某种东西那样的话,所以当我有时间的时候,我可以经常快速地运行大部分测试,并且整个设置会在一段时间内完成.
现在,我只是unittest.main()用来开始测试.
谢谢.
Ami*_*ski 80
要只运行一个特定的测试,您可以使用:
$ python -m unittest test_module.TestClass.test_method
更多信息在这里
S.L*_*ott 50
默认情况下unittest.main()使用默认测试加载程序从运行main的模块中生成TestSuite.
您不必使用此默认行为.
例如,您可以创建三个unittest.TestSuite实例.
"快速"子集.
fast = TestSuite()
fast.addTests( TestFastThis )
fast.addTests( TestFastThat )
"慢"子集.
slow = TestSuite()
slow.addTests( TestSlowAnother )
slow.addTests( TestSlowSomeMore )
"整体"集.
alltests = unittest.TestSuite([fast, slow])
请注意,我已调整TestCase名称以指示快速与慢速.您可以继承unittest.TestLoader来解析类的名称并创建多个加载器.
然后你的主程序可以使用optparse或argparse(自2.7或3.2以来可用)解析命令行参数,以选择要运行的套件,快速,慢速或全部.
或者,您可以相信这sys.argv[1]是三个值之一,并使用像这样简单的东西
if __name__ == "__main__":
    suite = eval(sys.argv[1])  # Be careful with this line!
    unittest.TextTestRunner().run(suite)
Tzu*_*hay 10
实际上,可以将测试用例的名称作为sys.argv传递,并且只测试那些情况.
例如,假设你有
class TestAccount(unittest.TestCase):
    ...
class TestCustomer(unittest.TestCase):
    ...
class TestShipping(unittest.TestCase):
    ...
account = TestAccount
customer = TestCustomer
shipping = TestShipping
你可以打电话
python test.py account
只进行帐户测试,甚至是
$ python test.py account customer
两个案例都经过测试
Alf*_*lfe 10
我这样做是为了简单skipIf:
import os
SLOW_TESTS = int(os.getenv('SLOW_TESTS', '0'))
@unittest.skipIf(not SLOW_TESTS, "slow")
class CheckMyFeature(unittest.TestCase):
    def runTest(self):
        …
这样我只需用这一行来装饰已经存在的测试用例(不需要创建测试套件或类似的,只需要os.getenv()在我的单元测试文件的开头创建一个调用行),并且默认情况下会跳过此测试.
如果我想尽快执行它,我只需要调用我的脚本:
SLOW_TESTS=1 python -m unittest …
你基本上有两种方法可以做到:
我是他第二种方法的坚定支持者; 单元测试应该只测试一个非常单元的代码,而不是复杂的系统(如数据库或集群).但我明白并非总是可行; 有时,创建模型太昂贵了,或者测试的目标确实在复杂的系统中.
回到选项(1),您可以这样做:
suite = unittest.TestSuite()
suite.addTest(MyUnitTestClass('quickRunningTest'))
suite.addTest(MyUnitTestClass('otherTest'))
然后将套件传递给测试运行器:
unittest.TextTestRunner().run(suite)
有关python文档的更多信息:http://docs.python.org/library/unittest.html#testsuite-objects
既然您使用,unittest.main()您可以运行python tests.py --help以获取文档:
Usage: tests.py [options] [test] [...]
Options:
  -h, --help       Show this message
  -v, --verbose    Verbose output
  -q, --quiet      Minimal output
  -f, --failfast   Stop on first failure
  -c, --catch      Catch control-C and display results
  -b, --buffer     Buffer stdout and stderr during test runs
Examples:
  tests.py                               - run default set of tests
  tests.py MyTestSuite                   - run suite 'MyTestSuite'
  tests.py MyTestCase.testSomething      - run MyTestCase.testSomething
  tests.py MyTestCase                    - run all 'test*' test methods
                                               in MyTestCase
也就是说,你可以做到
python tests.py TestClass.test_method
我根据unittest.skip装饰器的工作方式找到了另一个解决方案。通过设置__unittest_skip__和__unittest_skip_why__。
基于标签
我想应用一个标签系统,将一些测试标记为quick, slow, glacier, memoryhog, cpuhog, core, 等等。
然后运行all 'quick' tests,或者run everything except 'memoryhog' tests,您的基本白名单/黑名单设置
执行
我分两部分实现:
@testlabel类装饰器)unittest.TestRunner标识要跳过哪些测试,并在执行前修改测试列表内容。工作实现在这个要点中:https : //gist.github.com/fragmuffin/a245f59bdcd457936c3b51aa2ebb3f6c
(一个完整的例子太长了,不能放在这里。)
结果是...
$ ./runtests.py --blacklist foo
test_foo (test_things.MyTest2) ... ok
test_bar (test_things.MyTest3) ... ok
test_one (test_things.MyTests1) ... skipped 'label exclusion'
test_two (test_things.MyTests1) ... skipped 'label exclusion'
----------------------------------------------------------------------
Ran 4 tests in 0.000s
OK (skipped=2)
MyTests1跳过所有类测试,因为它有foo标签。
--whitelist 也有效
| 归档时间: | 
 | 
| 查看次数: | 44940 次 | 
| 最近记录: |