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 arguments | Testing 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"
无需编写类、命令行入口点等,
如何构建一个简单的测试:
- 为了编写测试,需要知道要测试什么。
- 它是否涵盖单元测试和/或集成测试?
- 所有类型的必要输入(它可以在整数、浮点数、类型数据类型等之间)和执行它们的代码并获得输出并将输出与预期结果进行比较。
如何编写断言:
断言只不过是根据已知响应验证输出。即在上面的代码中,我们传递了包含 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 ,这适用于运行目录中的所有测试:
- 首先从项目工具窗口中,选择测试目录
- 然后,在上下文菜单中,选择“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包含以下内容:
language: python
python:
install:
– pip install -r
script:
– python -m unittest discover
上面的文件指示“Travis CI”查看这个文件,对于给定的Python版本,通过安装需求文件中给出的必要包来测试测试用例,最后运行下面的命令来运行测试。
python -m unittest discover
结果在网站上与您的凭据不符