1.功能测试

常规测试

  1. #常规测试代码,一个模块写功能,一个模块调用功能
  2.  
  3. #=============模块1:gongneng_ceshi
  4. def func(v1, v2):
  5. return v1* v2
  6. #=============模块2
  7. from gongneng_ceshi import func #导入模块1
  8.  
  9. def main():
  10. if func(5,6) *3 ==30:
  11. print("乘法计算ok")
  12. else:
  13. print("数学乘法计算失败!")
  14.  
  15. def main2():
  16. if func("hello",3) == "hellohellohello":
  17. print("字符串乘法计算ok")
  18. else:
  19. print("字符串乘法计算失败!")
  20. if __name__ == '__main__':
  21. main()
  22. main2()
  23. """
  24. 数学乘法计算失败!
  25. 字符串乘法计算ok
  26. """
  27. 常规的功能测试代码,结构简单,测试单一,测试比较分散

doctest模块,测试单个功能

  1. import doctest
  2.  
  3. #在程序中,对执行部分进行描述,结果部分直接编写
  4. # 坑逼模块,>>> 后面必须留一个空格,不然会报错!!!
  5. def fun(v1, v2):
  6. """
  7. >>> fun(5,6)
  8. 30
  9. >>> fun("he",2)
  10. 'hehe'
  11. """
  12. return v1 * v2
  13.  
  14. if __name__ == '__main__':
  15. doctest.testmod(verbose=True)
  16. #True表示,执行时候输出详细信息,默认为False
  17. """
  18. 返回执行时间
  19. Testing started at 10:32 ...
  20. """

unittest模块,测试单个文件

  1. #功能模块1==============================
  2. class Math:
  3. def add(self, numa, numb):
  4. return numa + numb
  5. def sub(self, numa, numb):
  6. return numa - numb
  7.  
  8. if __name__ == '__main__':
  9. m = Math()
  10. #测试模块2==============================
  11. from unitest_demo import Math
  12.  
  13. import unittest
  14.  
  15. class Testmath(unittest.TestCase): #继承testcase父类
  16. @classmethod
  17. def setUpClass(self):
  18. print("【=======全部测试开始=====】")
  19. @classmethod
  20. def tearDownclass(self):
  21. print("【=======全部测试结束=====】")
  22. def tearDown(self) -> None:
  23. print("{}:测试结束".format(self.id()))
  24. def setUp(self) -> None:
  25. print("{}:测试开始".format(self.id()))
  26. def test_add(self):
  27. self.assertEqual(Math().add(1,2),3)
  28.  
  29. # 不需要测试的功能,使用装饰器进行装饰
  30. @unittest.skip("Math.sub方法,功能暂不需要测试。")
  31. def test_sub(self):
  32. self.assertEqual(Math().sub(3,2),1)
  33. if __name__ == '__main__':
  34. unittest.main()
  35.  
  36. """
  37. ============================= test session starts =============================
  38. collecting ... collected 2 items
  39. test_math.py::Testmath::test_add 【=======全部测试开始=====】
  40. PASSED [ 50%]test_math.Testmath.test_add:测试开始
  41. test_math.Testmath.test_add:测试结束
  42. test_math.py::Testmath::test_sub SKIPPED (Math.sub方法,功能暂不需要...) [100%]
  43. Skipped: Math.sub方法,功能暂不需要测试。
  44. =================== 1 passed, 1 skipped, 1 warning in 0.04s ===================
  45. Process finished with exit code 0
  46. """

unittest模块,测试多个文件

  1. # 测试文件,都保存在某个目录下,可以集中测试全部文件
    # 下面定义一个单独的模块脚本
  2.  
  3. import os
  4. import unittest
  5.  
  6. class RunAllTest(unittest.TestCase):
  7. def test_run(self):
  8. case_path = os.getcwd() # 获取测试文件目录
  9. discover = unittest.defaultTestLoader.discover(case_path, pattern="test_ma*.py")
  10. runner = unittest.TextTestRunner(verbosity=2)
  11. runner.run(discover)
  12. if __name__ == '__main__':
  13. unittest.main()
  14.  
  15. """
  16. Testing started at 20:25 ...
  17. Launching pytest with arguments test_file.py::RunAllTest --no-header --no-summary -q in E:\code\hunjia_16\day11_0824\unittest_demo
  18. ============================= test session starts =============================
  19. collecting ... collected 1 item
  20. test_file.py::RunAllTest::test_run PASSED [100%]【=======全部测试开始=====】
  21. test_math.Testmath.test_add:测试开始
  22. test_math.Testmath.test_add:测试结束
  23. test_add (test_math.Testmath) ... ok
  24. test_sub (test_math.Testmath) ... skipped 'Math.sub方法,功能暂不需要测试。'
  25. ----------------------------------------------------------------------
  26. Ran 2 tests in 0.001s
  27. OK (skipped=1)
  28. ======================== 1 passed, 1 warning in 0.01s =========================
  29. """

2.性能测试cProfile

  1. #性能分析,profile,以及cprofile模块
  2.  
  3. import cProfile #需要导入模块cProfile,注意P是大写
  4. def plu(num):
  5. s = 0
  6. for i in range(num):
  7. s += i
  8. return s
  9. if __name__ == '__main__':
  10. # 测试plu功能函数,后面可定义结果保存位置,文件名【不定义位置,会直接输出】
  11. cProfile.run("plu(9999999)", "f:\\test.result")
  12. """
  13. ncalls tottime percall cumtime percall filename:lineno(function)
  14. 函数调用总次数 总运行时间 运行平均时间 总计运行时间 运行一次的平均时间 所在文件名,代码行,函数名
  15.  
  16. ncalls tottime percall cumtime percall filename:lineno(function)
  17. 1 0.000 0.000 0.542 0.542 <string>:1(<module>)
  18. 1 0.542 0.542 0.542 0.542 cprofile_demo.py:4(plu)
  19. 1 0.000 0.000 0.542 0.542 {built-in method builtins.exec}
  20. 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
  21.  
  22. """

pstats报告的保存分析

  1. import pstats #需要先导入模块
  2. def main():
  3. stats = pstats.Stats( "f:\\test.result") #定义保存位置
  4. stats.sort_stats("time") #按照时间排序
  5. stats.print_stats() # 打印统计报告
  6. if __name__ == '__main__':
  7. main()
  8. """
  9. Wed Aug 25 16:48:48 2021 f:\test.result
  10. 4 function calls in 0.589 seconds
  11. Ordered by: internal time
  12. ncalls tottime percall cumtime percall filename:lineno(function)
  13. 1 0.589 0.589 0.589 0.589 E:/code/hunjia_16/day11_0824/xing_neng_ceshi/cprofile_demo.py:4(plu)
  14. 1 0.000 0.000 0.589 0.589 {built-in method builtins.exec}
  15. 1 0.000 0.000 0.589 0.589 <string>:1(<module>)
  16. 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
  17. """

3.代码规范性检测

python默认是pep8的规范,pycharm就是遵守这个规范,Ctrl+Alt+L可以直接调整格式

pylint模块规范检测组件

  1. #需要先安装pylint包
  2. #方法1==================================
  3. """
  4. 1.编写一段代码
  5. 2.进入Terminal窗口
  6. 3.cd到当前脚本目录
  7. 4.pylint 文件名
  8. pylint .\pylint_demo.py
  9. 5.会得到类似如下返回结果
  10. ************* Module pylint_demo
  11. pylint_demo.py:4:0: C0305: Trailing newlines (trailing-newlines)
  12. pylint_demo.py:1:0: C0114: Missing module docstring (missing-module-docstring)
  13. pylint_demo.py:1:0: C0115: Missing class docstring (missing-class-docstring)
  14. pylint_demo.py:2:4: C0116: Missing function or method docstring (missing-function-docstring)
  15. pylint_demo.py:2:4: R0201: Method could be a function (no-self-use)
  16. pylint_demo.py:1:0: R0903: Too few public methods (1/2) (too-few-public-methods)
  17.  
  18. """
  19. #方法2==================================
  20. """
  21. 1.进入pycharm
  22. 2.打开settings---Tools---External Tools---添加执行工具----配置相关信息
  23. 3.运行程序即可
  24. """

flake8模块规范检测组件

  1. # 操作同上

Python入门-程序测试的更多相关文章

  1. Mahout学习之Mahout简介、安装、配置、入门程序测试

    一.Mahout简介 查了Mahout的中文意思——驭象的人,再看看Mahout的logo,好吧,想和小黄象happy地玩耍,得顺便陪陪这位驭象人耍耍了... 附logo: (就是他,骑在象头上的那个 ...

  2. Python入门-程序结构扩展

    deque双端队列 #双端队列,就是生产消费者模式,依赖collections模块 from collections import deque def main(): info = deque((&q ...

  3. Python入门-函数的使用到程序的公布安装

    Python入门-函数的使用到Python的公布安装 本文主要适合有一定编程经验,至少掌握一门编程语言的人查看. 文中样例大多都是简单到认识英文单词就能看懂的水平,主要讲的是Python的总体使用方法 ...

  4. Python入门(一):PTVS写Python程序,调试模式下input()提示文字乱码问题

    前两天写了Python入门(一),里面提到,使用VS2013+PTVS进行Python开发. 就在准备为第二篇写个demo的时候,发现了一个问题,各种解决无果,有些纠结 Python中输入函数是inp ...

  5. python web入门程序

    python2.x web入门程序 #!/usr/bin/python # -*- coding: UTF-8 -*- # 只在python2.x 有效 import os #Python的标准库中的 ...

  6. python入门(7)Python程序的风格

    python入门(7)Python程序的风格 Python采用缩进方式,写出来的代码就像下面的样子: # print absolute value of an integer: a = 100 if ...

  7. python入门(4)第一个python程序

    python入门(4)第一个python程序 在交互式环境的提示符>>>下,直接输入代码,按回车,就可以立刻得到代码执行结果.现在,试试输入100+200,看看计算结果是不是300: ...

  8. 怎么样通过编写Python小程序来统计测试脚本的关键字

    怎么样通过编写Python小程序来统计测试脚本的关键字 通常自动化测试项目到了一定的程序,编写的测试代码自然就会很多,如果很早已经编写的测试脚本现在某些基础函数.业务函数需要修改,那么势必要找出那些引 ...

  9. 40个Python入门小程序

    有不少同学学完Python后仍然很难将其灵活运用.我整理 37 个Python入门的小程序.在实践中应用Python会有事半功倍的效果. 分享 Github 项目,里面收集了 Python 学习资料 ...

随机推荐

  1. OSPF协议原理及配置2-理解邻居和邻接关系

    OSPF是一个动态路由协议,运行OSPF的路由器之间需要交换链路状态信息和路由信息,在交换这些信息之前首先需要建立邻接关系.邻接关系用来交换链路状态及路由信息. 注意:并非所有的邻居关系都可以成为邻接 ...

  2. .NET 6学习笔记(2)——通过Worker Service创建Windows Service

    通过Visual Studio中的Windows Service模板,我么可以创建.NET Framework版本的Windows Service,网络上对此已有详细且丰富的各路教程.但在我们升级到. ...

  3. CentOS停更;阿里发布全新操作系统(Anolis OS)

    镜像下载.域名解析.时间同步请点击阿里云开源镜像站 Linux系统对于Java程序员来说,就好比"乞丐手里的碗",任何业务都离不开他的身影,因为服务端的广泛使用,也因此衍生出了各种 ...

  4. 阿里云开源镜像站支持IPv6访问

    阿里云开源镜像站在国内企业镜像站中率先支持IPv6访问! 点击立即试用https://developer.aliyun.com/mirror/ 同时基于阿里云OpenSearch的搜索能力,开源镜像站 ...

  5. springboot 踩坑之路之 Configuration Annotation Proessor not found in classpath

    1.出现spring boot Configuration Annotation Proessor not found in classpath的提示是在用了@ConfigurationPropert ...

  6. 深度学习工具LabelXml安装教程

    LabelXml安装教程 1,下载LabelXml工具 前往github上下载labelxml,官网地址如下:https://github.com/tzutalin/labelImg 下载打包源码为z ...

  7. Git-rebase使用原理

    使用 Git 已经好几年了,却始终只是熟悉一些常用的操作.对于 Git Rebase 却很少用到,直到这一次,不得不用. 一.起因 上线构建的过程中扫了一眼代码变更,突然发现,commit 提交竟然多 ...

  8. 进制转换 Java day6

    今天周末学习的不多,只学习了一些二进制转十进制,八进制.十六进制,以及数据单位 二进制转十进制 我们都知道十进制转二进制就是除以2取余的方法.那二进制转到十进制又如何处理呢,今天我来学习以下 我们看看 ...

  9. luoguP6619 [省选联考 2020 A/B 卷]冰火战士(线段树,二分)

    luoguP6619 [省选联考 2020 A/B 卷]冰火战士(线段树,二分) Luogu 题外话1: LN四个人切D1T2却只有三个人切D1T1 很神必 我是傻逼. 题外话2: 1e6的数据直接i ...

  10. redis之 主从复制和哨兵(一)

    一.Redis主从复制 主从复制:主节点负责写数据,从节点负责读数据,主节点定期把数据同步到从节点保证数据的一致性 1. 主从复制的相关操作 a,配置主从复制方式一.新增redis6380.conf, ...