1.功能测试

常规测试

#常规测试代码,一个模块写功能,一个模块调用功能

#=============模块1:gongneng_ceshi
def func(v1, v2):
return v1* v2
#=============模块2
from gongneng_ceshi import func #导入模块1 def main():
if func(5,6) *3 ==30:
print("乘法计算ok")
else:
print("数学乘法计算失败!") def main2():
if func("hello",3) == "hellohellohello":
print("字符串乘法计算ok")
else:
print("字符串乘法计算失败!")
if __name__ == '__main__':
main()
main2()
"""
数学乘法计算失败!
字符串乘法计算ok
"""
常规的功能测试代码,结构简单,测试单一,测试比较分散

doctest模块,测试单个功能

import doctest  

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

unittest模块,测试单个文件

#功能模块1==============================
class Math:
def add(self, numa, numb):
return numa + numb
def sub(self, numa, numb):
return numa - numb if __name__ == '__main__':
m = Math()
#测试模块2==============================
from unitest_demo import Math import unittest class Testmath(unittest.TestCase): #继承testcase父类
@classmethod
def setUpClass(self):
print("【=======全部测试开始=====】")
@classmethod
def tearDownclass(self):
print("【=======全部测试结束=====】")
def tearDown(self) -> None:
print("{}:测试结束".format(self.id()))
def setUp(self) -> None:
print("{}:测试开始".format(self.id()))
def test_add(self):
self.assertEqual(Math().add(1,2),3) # 不需要测试的功能,使用装饰器进行装饰
@unittest.skip("Math.sub方法,功能暂不需要测试。")
def test_sub(self):
self.assertEqual(Math().sub(3,2),1)
if __name__ == '__main__':
unittest.main() """
============================= test session starts =============================
collecting ... collected 2 items
test_math.py::Testmath::test_add 【=======全部测试开始=====】
PASSED [ 50%]test_math.Testmath.test_add:测试开始
test_math.Testmath.test_add:测试结束
test_math.py::Testmath::test_sub SKIPPED (Math.sub方法,功能暂不需要...) [100%]
Skipped: Math.sub方法,功能暂不需要测试。
=================== 1 passed, 1 skipped, 1 warning in 0.04s ===================
Process finished with exit code 0
"""

unittest模块,测试多个文件

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

2.性能测试cProfile

#性能分析,profile,以及cprofile模块

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

pstats报告的保存分析

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

3.代码规范性检测

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

pylint模块规范检测组件

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

flake8模块规范检测组件

# 操作同上

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. 关于SQL Server 各种安装失败均失败,报错“等待数据库引擎恢复句柄失败”的经验分享

    最近安装SQL 2019遇到这个问题,试过自己合网上几乎所有办法,怎么都安装不上,最后在微软社区解决了,由于这个问题比较特殊,并且网上几乎没有正确的决绝方案,因此将我的解决过程及经验记录分享一下,也为 ...

  2. CF1106F题解

    居然没人写常系数齐次线性递推/jy 题意明确. 首先我们注意到这个系数是在幂上面的,这道题的各种信息都是建立在乘法上的,十分不好处理,考虑求一个 \(\ln\) 将这些信息建立在加法上. \[\ln ...

  3. VS2010 显示TFS删除项

    通过 TFS 是删除的工程显示出来, 操作步骤.Tools->Options-> Source Control ->Visual Studio Team Foundation Ser ...

  4. VuePress 博客之 SEO 优化(五)添加 JSON-LD 数据

    前言 在 <一篇带你用 VuePress + Github Pages 搭建博客>中,我们使用 VuePress 搭建了一个博客,最终的效果查看:TypeScript 中文文档. 本篇讲 ...

  5. 除了增删改查你对MySQL还了解多少?

    目录 除了增删改查你对MySQL还了解多少? MySQL授权远程连接 创建用户.授权 客户端与服务器连接的过程 TCP/IP 命名管道和共享内存 Unix域套接字文件 查询优化 MySQL中走与不走索 ...

  6. Docker容器入门实践

    Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目.它基于 Google 公司推出的 Go 语言实现. 项目后来加入了 Linux 基金会,遵从了 ...

  7. java常见面试问题总结

    JDK1.7 并发的HashMap为什么会引起死循环? hashmap如何解决hash冲突,为什么hashmap中的链表需要转成红黑树? hashmap什么时候会触发扩容? jdk1.8之前并发操作h ...

  8. Oracle Yum源

    仓库地址(非Yum源仓库):https://public-yum.oracle.com/repo/OracleLinux/OL7/latest/x86_64/index.html 如何连接到 Orac ...

  9. 说说has a与is a的区别?

    is a是典型的"一般到特殊"的关系,也就是典型的继承关系.例如Apple is a Fruit.那么Apple是一种特殊的Fruit,也就是说Apple继承了Fruit. has ...

  10. python 列表推导式,生成器推导式,集合推导式,字典推导式简介

    1.列表推导式multiples = [i for i in range(30) if i % 2 is 0]names = [[],[]]multiples = [name for lst in n ...