有没有推荐的命令用于“hg bisect --command”?
我遇到了一个紧急的bug,明天必须找到它的原因。我知道之前有一个好的版本,所以我想用hg bisect这个工具来帮助我。
不过,我在Windows系统上,不想去写那些复杂的DOS脚本。
理想情况下,我希望能写一个Python的单元测试,然后让hg bisect来使用这个测试。这是我第一次尝试。
bisector.py
#!/usr/bin/env python
import sys
import unittest
class TestCase(unittest.TestCase):
def test(self):
#raise Exception('Exception for testing.')
#self.fail("Failure for testing.")
pass
def main():
suite = unittest.defaultTestLoader.loadTestsFromTestCase(TestCase)
result = unittest.TestResult()
suite.run(result)
if result.errors:
# Skip the revision
return 125
if result.wasSuccessful():
return 0
else:
return 1
if '__main__' == __name__:
sys.exit(main())
也许我可以这样运行:
hg bisect --reset
hg bisect --bad
hg bisect --good -r 1
hg bisect --command=bisector.py
有没有更好的方法呢?谢谢大家的建议。
3 个回答
1
如果你手头有一些Unix工具,可以注意到'grep'这个命令的退出状态是很有用的。也就是说,如果你的单元测试在通过时打印“PASS”,你可以这样做:
hg bisect -c './unittest | grep PASS'
这样做效果会非常好。
4
我觉得你可以把你的 main()
函数去掉,改用下面这个代码块来运行测试:
if __name__ == '__main__':
unittest.main()
调用 unittest.main()
这个函数会自动运行这个文件里找到的所有测试,并根据测试结果是通过还是失败,给出一个合适的状态码来结束程序。
10
感谢大家,特别是Will McCutchen。
下面是最有效的解决方案。
bisector.py
#!/usr/bin/env python
import unittest
class TestCase(unittest.TestCase):
def test(self):
# Raise an assertion error to mark the revision as bad
pass
if '__main__' == __name__:
unittest.main()
最难的部分是正确使用hg bisect命令:
hg update tip
hg bisect --reset
hg bisect --bad
hg bisect --good 0
hg bisect --command ./bisector.py
在Windows上,最后一个命令是:
hg bisect --command bisector.py