为什么django不使用unittest显示测试结果?

时间:2015-04-02 10:27:12

标签: python django django-rest-framework python-unittest

当我使用 unittest 模块测试我的模型时出现问题,即除了来自" print"的字符串之外,该过程成功时没有显示任何内容。我的用户迭代的结果没有显示出来。我的洞是在下面:

1,models.py

    class UserManager(models.Manager):
      def hah(self):
        return None
    class User(models.Model):
                id = models.IntegerField(primary_key=True)  
                email = models.CharField(unique=True, max_length=50)
                password = models.CharField(max_length=50)
                logintime = models.IntegerField(default='')
                registertime = models.IntegerField()
                modifytime = models.IntegerField()
                loginip = models.CharField(max_length=60)
                islock = models.IntegerField()
                isavtive = models.IntegerField()
                activecode = models.CharField(max_length=45)
                role = models.CharField(max_length=1)

                objects = UserManager()
                class Meta:
                    db_table = 'user'

2,serializers.py

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id','email','password','loginip')

第3,tests.py

class UserModelTest(unittest.TestCase):
    def get_user(self):
        users = User.objects.all()
        userserializer = UserSerializer(users,many=True)
        print(userserializer.data)
        print(users)
        for row in users:
            print(row.email)
        print("this is user model test")

当我运行python3.4 ./manage.py test user.tests.UserModelTest.get_user时,结果为:

Creating test database for alias 'default'...
[]
[]
this is user model test
.
----------------------------------------------------------------------
Ran 1 test in 0.001s

OK
Destroying test database for alias 'default'...

我是否错过了关于unittest的事情或任何误解?我注意到有人遇到同样的问题,他们建议做的是添加-- -s选项,但不适合我。还有什么解决方案吗?提前谢谢!

1 个答案:

答案 0 :(得分:3)

这是正确的显示,但你没有写任何测试 为了能够编写单元测试,你应该知道几件事:

  1. 你的测试函数应该从单词test开始,例如test_get_user_query,这是为了使你的测试可以调用:
    ./manage.py test appName所以你不必参考测试的整个路径。
  2. 单元测试中使用的数据库与开发数据库是隔离的,这意味着它完全是空的,每次要测试它时都需要填充它,对于你的例子,你应该在开始时添加这样的一行。 get_usersetUp()功能:
    User.objects.create(email='exp@me.com', password='somepass'....)(填充其余部分)以便稍后查询
  3. 使用asserts编写测试,不应该使用print,这是一个例子:
  4. class UserModelTest(unittest.TestCase):
        def test_get_user_and_data_is_serialized(self):
            User.objects.create(email='exp@me.com', password='somepass'....)
            user = User.objects.all()[0]  # start testing one entry.
            self.assertEqual(user.email, 'exp@me.com', 'Incorret email') # message when test fails
            serialized_user = UserSerializer(users,many=False)
            self.assertEqual(userserializer.data, {'email': 'exp@me.com', ....}, 'oops the data is not serialized')
    

    只需更改您要测试的数据,这只是一个示例

    有关unittest模块的更多信息,如果您需要更多帮助,请阅读此内容https://docs.python.org/2/library/unittest.html

    另请查阅Harry J.W.Percival的这本书,这是一个很好的资源:
    http://www.obeythetestinggoat.com/

    希望这有帮助!