📜  Python测试入门

📅  最后修改于: 2022-05-13 01:54:40.987000             🧑  作者: Mango

Python测试入门

在这里,我们将学习如何创建一个基本测试,执行它,并在您的用户之前找到错误!您将了解可用于编写和执行测试的工具,还可以了解自动化、手动、单元和集成测试等测试术语。

自动与手动测试

Automated Manual Testing 
 
Test automation software along with testing tools executes the test cases.Explicitly humans involved in executing the tests step by step, and they may be testing without test scripts.
Test cases are written by QA engineers but execution is fully automatic and it is quite faster and will run for n number of different scenarios.Analysts and QA engineers need to get involved in end-to-end testing and time consuming.
In Python, we need to install a package named “unittest”.In Python, via “White Box Testing”,” Unit Testing”,” Integration Testing” etc., methodologies, Manual testing can be carried out.

单元测试与集成测试

Unit Tests Integration Tests 
Unit testing works on component by component basis and hence if any small component to be tested, we need to go for unit testing.Integration testing works on the whole component, we can conclude as many unit tests make integration testing. And also a software is complete if whole integration testing is complete
Testing of addition calculation alone in a calculator program for specific set of argumentsTesting of all arithmetic operations like addition, subtraction etc., (whatever present in calculator program) with different set of arguments

单元测试示例:

Python3
# define a function
def test_sum_numbers():
    assert sum([100, 200, 300,400]) == 1000, "Result should be 1000"
 
# define a function
def test_sum_tuple_values():
    assert sum((100, 200, 200,400)) == 1000, "Result should be 1000"
 
# Driver code
if __name__ == "__main__":
   
    test_sum_numbers()
    test_sum_tuple_values()
     
    print("Checking whether all tests are passed or not")


Python3
# import library
import unittest
 
# create a class
class TestXXXXX(unittest.TestCase):
   
      # define a function
    def test_xxxxxxx(self):
       
        data = [100, 200, 300]
        result = sum(data)
        self.assertEqual(result, 6000)
 
# driver code
if __name__ == '__main__':
   
    unittest.main()


Python3
def test_sum_numbers_using_pytest():
    assert sum([700, 900]) == 1600, "Resultant should be 1600"
 
def test_sum_tuple_using_pytest():
    assert sum((700,1900)) == 1600, "Resultant should be 1600"


Python3
from django.test import TestCase
 
class RequiredTestCases(TestCase):
    # Write all Test methods


Python3
# import our application file
import my_app
 
# import library
import unittest
 
class FlaskTestCase(unittest.TestCase):
 
    def setUp(self):
        my_app.app.testing = True
        self.app = my_app.app.test_client()
 
    def test_home(self):
        result = self.app.get('/')


Python3
import unittest
 
class TestSumDifferentPatterns(unittest.TestCase):
    def test_list_tuple_values(self):
       
        # Summation of numbers present
        # in a tuple value
        data = (10*2, 200*2)
        result = sum(data)
        self.assertEqual(result, 600)
 
    def test_bad_data_type(self):
        data = "alpha value passed instead of numeric"
        # Because of the below condition, TypeError
        # occurs and hence it will not proceed
        # to next step
        with self.assertRaises(TypeError):
            result = sum(data)
 
if __name__ == '__main__':
    unittest.main()


输出:

Traceback (most recent call last):
 File "....../test_example.py", line 9, in 
   test_sum_tuple_values()
 File "...../test_example.py", line 5, in test_sum_tuple_values
   assert sum((100, 200, 200,400)) == 1000, "Result should be 1000"
AssertionError: Result should be 1000

在上面的示例中,我们在这里有两个方法,当执行代码时,第二个方法会抛出错误,因为给定的值不会产生 1000。

选择测试运行器:

Test Runner 是一个库或测试工具,它读取包含单元测试和一系列可以执行的设置的源代码,并将其输出到控制台或日志文件。
Python中有不同的测试运行器可用。流行的是

  • 单元测试
  • 鼻子或鼻子2
  • pytest

unittest :它内置在标准Python库中。 import unittest应该是使用它的代码的起始行。取决于Python版本,它应该有所不同,因为更高版本的Python支持 unittest 和更早版本支持 unittest2。
下面给出了使用 unittest 的Python代码示例片段:

Python3

# import library
import unittest
 
# create a class
class TestXXXXX(unittest.TestCase):
   
      # define a function
    def test_xxxxxxx(self):
       
        data = [100, 200, 300]
        result = sum(data)
        self.assertEqual(result, 6000)
 
# driver code
if __name__ == '__main__':
   
    unittest.main()

输出:

======================================================================
.F
FAIL: test_xxxxxxx (__main__.TestXXXXX)
----------------------------------------------------------------------
Traceback (most recent call last):
 File "......py", line 8, in test_xxxxxxx
   self.assertEqual(result, 6000)
AssertionError: 600 != 6000
----------------------------------------------------------------------
Ran 1 test in 0.001s
FAILED (failures=1)

鼻子或鼻子2:这是一个开源应用程序,仅类似于单元测试。它与使用单元测试框架编写的多种测试兼容。鼻子2是最新的版本,它们是通过使用安装的。

pip install nose2 

pytest:它支持 unittest 测试用例的执行。它具有支持内置断言语句、过滤测试用例、从上次失败的测试返回等优点

Python3

def test_sum_numbers_using_pytest():
    assert sum([700, 900]) == 1600, "Resultant should be 1600"
 
def test_sum_tuple_using_pytest():
    assert sum((700,1900)) == 1600, "Resultant should be 1600"


无需编写类、命令行入口点等,

如何构建一个简单的测试:

  1. 为了编写测试,需要知道要测试什么。
  2. 它是否涵盖单元测试和/或集成测试?
  3. 所有类型的必要输入(它可以在整数、浮点数、类型数据类型等之间)和执行它们的代码并获得输出并将输出与预期结果进行比较。

如何编写断言:

断言只不过是根据已知响应验证输出。即在上面的代码中,我们传递了包含 3 个值的列表,即 10、20 和 30,我们知道它的乘法结果是 6000。所以作为代码的最后一步,我们将编写断言代码,上面的代码出现了assertEqual 肯定会给出 6000 的输出,因此测试用例通过。

unittest有很多方法可以断言变量的值、类型和存在性。
让我们看看几个:

.assertEqual(one,two) means one == two (Our above example) 
.assertTrue(expr) means boolean(expr) is True 
.assertFalse(expr) means boolean(expr) is False 
.assertIs(one,two) means one is two 

我们也有相反的方法,例如:

.assertIsNot(one,two) means one is not two. 
.assertIsNone(x) vs .assertIsNone(x) 
.assertIn(x, y) vs .assertNotIn(x, y) 
.assertIsInstance(m, n) vs .assertNotIsInstance(m,n) 

副作用:

一段代码的连续执行有可能改变其他事物以改变类的属性甚至数据库中的值。所以这些都是需要在做测试之前决定的。需要考虑重构代码以打破副作用并编写可重复且简单的单元测试。

从 PyCharm 运行测试:

我们可以按照以下步骤运行 unittest 或 pytest ,这适用于运行目录中的所有测试:

  1. 首先从项目工具窗口中,选择测试目录
  2. 然后,在上下文菜单中,选择“UnitTests in”或“PyTests in”
    对于个人测试,
    • 通过使用运行或调试命令通过主工具栏
    • 通过上下文菜单使用运行或通过单击特定文件进行调试

测试 Django 和 Flask 等 Web 框架:

基于 unittest,Django 和 Flask 使事情变得更简单,并且他们有自己的测试框架:

Django Test Runner: Django startapp 模板将在您的应用程序目录中创建一个 tests.py 文件。如果您还没有,可以使用以下内容创建它:

Python3

from django.test import TestCase
 
class RequiredTestCases(TestCase):
    # Write all Test methods


为了执行测试套装,我们需要给出:

python manage.py test

使用 unittest 和 Flask :Flask 要求将应用程序导入文件,然后设置为测试模式。您可以实例化测试客户端并使用测试客户端向应用程序中的任何路由发出请求。

所有测试客户端实例化都在测试用例的 setUp() 方法中完成。

Python3

# import our application file
import my_app
 
# import library
import unittest
 
class FlaskTestCase(unittest.TestCase):
 
    def setUp(self):
        my_app.app.testing = True
        self.app = my_app.app.test_client()
 
    def test_home(self):
        result = self.app.get('/')

可以使用以下命令(通过命令行)执行测试用例:

python -m unittest discover

更高级的测试场景:

  • 使用夹具,它只是作为输入创建并重用它们的数据。
  • 可以遵循参数化,这只不过是通过传递不同的值并期望相同的结果多次运行相同的测试。
  • 需要涵盖不同的场景,例如处理预期的故障、编写集成测试、在多个环境中进行测试等。

下面的示例显示了如何为错误的数据类型编写测试:

Python3

import unittest
 
class TestSumDifferentPatterns(unittest.TestCase):
    def test_list_tuple_values(self):
       
        # Summation of numbers present
        # in a tuple value
        data = (10*2, 200*2)
        result = sum(data)
        self.assertEqual(result, 600)
 
    def test_bad_data_type(self):
        data = "alpha value passed instead of numeric"
        # Because of the below condition, TypeError
        # occurs and hence it will not proceed
        # to next step
        with self.assertRaises(TypeError):
            result = sum(data)
 
if __name__ == '__main__':
    unittest.main()

输出

.F
======================================================================
FAIL: test_list_tuple_values (__main__.TestSumDifferentPatterns)
----------------------------------------------------------------------
Traceback (most recent call last):
 File "......py", line 10, in test_list_tuple_values
   self.assertEqual(result, 600)
AssertionError: 420 != 600
----------------------------------------------------------------------
Ran 2 tests in 0.001s
FAILED (failures=1)

自动化执行测试:

持续集成/持续部署工具可用。它们有助于运行测试、编译、发布以及部署到生产中。
https://travis-ci.com/ 就是其中之一,它与Python配合得很好,它是一个开源项目。登录网站并创建。 travis.yml包含以下内容:

上面的文件指示“Travis CI”查看这个文件,对于给定的Python版本,通过安装需求文件中给出的必要包来测试测试用例,最后运行下面的命令来运行测试。

python -m unittest discover 

结果在网站上与您的凭据不符