如何对目录中的所有文件运行单元测试?

时间:2015-09-18 17:18:15

标签: python unit-testing

我是学习Python的入门CS课程的TA,我想知道是否有办法在文件夹中的多个.py文件上运行一个单元测试文件

例如,如果我创建Homework1UnitTest.py并且我希望它在文件夹C:/ Users / Lien / Desktop / StudentSubmissionsHW1中的所有.py文件上运行,我该怎么做?

StudentSubmissionsHW1填充了.py文件,例如: jsmithhw1.py bjoneshw1.py sscotthw1.py 等等。

另外,当我学习单元测试时,我读到了将详细程度参数传递给unittest调用。是否有类似的东西,我可以看到所有失败的测试?

例如,如果我有类似的东西:

app.controller('WatchCtrl', function($scope, $http){
    $scope.getAll = function(){
      $http.get('http://www.myserver.com/videos/script.php')
        .then(function(response){
          $scope.videos = response.data;
          console.log(response); //to debug
        });
    }
    $scope.getAll();
  });

我可以设置我的结果来显示所有失败的assertEqual()函数而不仅仅是第一个吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

是的,discover功能仅使用此用例设计:

cd project_directory
python -m unittest discover

默认情况下,它只会在匹配模式test*.py的文件上运行,但如果您希望它在每个.py文件上运行,则可以改为:

python -m unittest discover -p "*.py"

关于你的第二个问题,第一个失败的断言将阻止函数内的其他测试甚至被运行;如果您需要更多粒度,最好为每个断言创建单独的测试函数,如here所述

更新:重新阅读您的问题,听起来您有一个单元测试文件,但想要在多个文件上运行这些单元测试。如何做到这一点将取决于在文件上运行它对您的特定用例有什么影响。但是,如果你的意思是那些文件有一些你想要的输入"参数"对于每个测试用例,一种方法是将每个测试嵌套在循环遍历目录中所有文件的forloop中。我之前做的另一件事是设置一个装饰器,它会在所有装饰的方法上为你自动设置这个forloop,例如:类似的东西:

def all_files(func):
    def wrapped(self, **kwargs):
        root = 'C:\Users\Lien\Desktop\StudentSubmissionsHW1'
        kwargs.pop('filepath',None)
        for filepath in glob.glob(os.path.join(root, '*.py')):
            func(self, filepath=filepath, **kwargs)   
    return wrapped

然后你可以像这样使用它:

class TestStringMethods(unittest.TestCase):

    @all_files
    def test_is_int(self, filepath=None):
        # run your test(s) using file filelpath...
        with open(filepath) as fobj:
            self.assertEqual(fobj.read().strip(), 'foobar')