【使用 Pytest 记录日志文件并确保测试用例正常执行】

news/2024/9/19 14:49:38/ 标签: pytest, 测试用例

1. 更新测试脚本

首先,确保你的测试脚本 wifi_test.py 配置了日志记录,并包含所有测试用例

import subprocess
import time
import logging
import pytest
import sys# 配置日志记录
logging.basicConfig(filename='wifi_test.log', level=logging.INFO,format='%(asctime)s - %(levelname)s - %(message)s')
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
console_handler.setFormatter(formatter)
logging.getLogger().addHandler(console_handler)def run_adb_command(command):"""运行 ADB 命令并返回输出。"""try:logging.info(f"执行命令: {command}")result = subprocess.run(command, shell=True, capture_output=True, text=True, encoding='utf-8', errors='ignore')output = result.stdout.strip() if result.stdout else Nonelogging.info(f"命令输出: {output}")return outputexcept Exception as e:logging.error(f"执行命令 '{command}' 时出错: {e}")return Nonedef enable_wifi():"""启用设备上的 WiFi。"""command = "adb shell svc wifi enable"run_adb_command(command)time.sleep(5)  # 等待 5 秒以确保 WiFi 已启用output = run_adb_command("adb shell dumpsys wifi")if output and "enabled" in output:logging.info("WiFi 启用成功。")return Trueelse:logging.error("无法启用 WiFi。")return Falsedef disable_wifi():"""禁用设备上的 WiFi。"""command = "adb shell svc wifi disable"run_adb_command(command)time.sleep(3)  # 等待 3 秒以确保 WiFi 已禁用output = run_adb_command("adb shell dumpsys wifi")if output and "disabled" in output:logging.info("WiFi 禁用成功。")return Trueelse:logging.error("无法禁用 WiFi。")return Falsedef start_wifi_scan():"""启动 WiFi 扫描。"""command = "adb shell cmd wifi start-scan"run_adb_command(command)def get_scan_results():"""获取 WiFi 扫描结果。"""command = "adb shell cmd wifi list-scan-results"output = run_adb_command(command)return outputdef check_wifi_status():"""检查 WiFi 状态。"""command = "adb shell dumpsys wifi"output = run_adb_command(command)if output:if "enabled" in output:return "enabled"elif "disabled" in output:return "disabled"return "unknown"@pytest.fixture(scope="module", autouse=True)
def setup_and_teardown():"""前置条件和后置清理"""logging.info("前置条件: 确保 WiFi 处于关闭状态。")status = check_wifi_status()logging.info(f"当前 WiFi 状态: {status}")if status == "enabled":logging.info("WiFi 已启用,尝试禁用 WiFi...")if not disable_wifi():logging.error("前置条件失败: 无法禁用 WiFi。终止测试。")pytest.exit("前置条件失败: 无法禁用 WiFi。终止测试。")elif status == "disabled":logging.info("WiFi 已处于关闭状态。")else:logging.error("无法确定 WiFi 状态。终止测试。")pytest.exit("无法确定 WiFi 状态。终止测试。")yieldlogging.info("测试结束,执行后置清理。")disable_wifi()def test_enable_wifi():"""用例 1: 启用 WiFi"""logging.info("用例 1: 启用 WiFi。")assert enable_wifi(), "用例 1: 启用 WiFi 失败"def test_start_wifi_scan():"""用例 2: 启动 WiFi 扫描并检查扫描结果"""logging.info("用例 2: 启动 WiFi 扫描并检查扫描结果。")start_wifi_scan()logging.info("等待 15 秒以获取扫描结果...")time.sleep(15)  # 等待扫描完成output = get_scan_results()assert output, "用例 2: WiFi 扫描结果为空"logging.info("用例 2: 扫描结果:")logging.info(output)def test_disable_wifi():"""用例 3: 检查 WiFi 状态。如果 WiFi 已启用,尝试在 3 秒内禁用 WiFi。"""logging.info("用例 3: 检查 WiFi 状态。如果 WiFi 已启用,尝试在 3 秒内禁用 WiFi。")status = check_wifi_status()logging.info(f"当前 WiFi 状态: {status}")if status == "enabled":logging.info("WiFi 已启用,开始尝试禁用 WiFi...")assert disable_wifi(), "用例 3: 禁用 WiFi 失败"else:logging.info("WiFi 当前未启用,不需要禁用。")if __name__ == '__main__':pytest.main()

pytest__133">2. 创建 pytest 配置文件

在你的项目目录下创建一个 pytest.ini 文件,并添加以下内容:

[pytest]
log_cli = true
log_cli_level = INFO
log_file = wifi_test.log
log_file_level = INFO

3. 运行测试

在你的项目目录下,运行以下命令:

pytest wifi_test.py

4. 其他可能问题的排查

  • 检查日志文件路径和权限:确保 wifi_test.log 文件路径正确,并且你有写入权限。
  • 检查 pytest 版本:确保你使用的是支持这些配置的 pytest 版本。可以通过运行 pytest --version 检查版本。
  • 检查日志配置:确认 logging.basicConfigpytest.ini 中的日志配置没有冲突。

如果按照这些步骤配置了日志记录和测试用例,应该能正确生成日志文件,并解决用例重复执行的问题。如果还有问题,可以进一步检查 pytest 的配置和命令是否正确。


http://www.ppmy.cn/news/1501447.html

相关文章

[css3] 如何设置边框颜色渐变

div {border: 4px solid;border-image: linear-gradient(to right, #8f41e9, #578aef) 1; }参考: 5种CSS实现渐变色边框(Gradient borders方法的汇总

tarojs项目启动篇

TaroJS 是一个开放式跨端开发解决方案,使用 React 语法规范来开发多端应用(包括小程序、H5、React Native 等)。它可以帮助开发者高效地构建出在不同端上运行一致的应用。以下是启动 TaroJS 项目(本来就有的旧项目)的步…

Linux字符设备驱动程序

Linux字符设备驱动程序 前言 在Linux中,设备一般被分成三种类型:字符设备、块设备和网络设备。这里我们主要关注字符设备,这也是Linux系统中最常见的设备类型,在Linux的ls命令的文件属性中用c表示这个文件是一个字符设备节点&am…

怎么给PDF文件加密码?关于PDF文件加密的四种方法推荐

怎么给PDF文件加密码?给PDF文件加上密码是保护文件安全的一种重要方法,特别是当需要在不受授权的访问下保护敏感信息时。这个过程不仅仅是简单地设置密码,而是涉及到对文档内容和访问控制的深思熟虑。加密PDF文件可以有效防止未经授权的用户查…

Redis 7.x 系列【29】集群原理之自动故障转移

有道无术,术尚可求,有术无道,止于术。 本系列Redis 版本 7.2.5 源码地址:https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 案例演示3. 工作原理3.1 故障检测3.2 排名3.3 延迟等待3.4 投票3.5 上位 1.…

LeetCode:相同的树(C语言)

1、问题概述:给2个二叉树的根节点p和q,如果2个树在结构和数值上都相同才为true,否则为false 2、示例 示例 1: 输入:p [1,2,3], q [1,2,3] 输出:true 示例 2: 输入:p [1,2], q […

软件开发者消除edge浏览器下载时“此应用不安全”的拦截方法

当Microsoft Edge浏览器显示“此应用不安全”或者“已阻止此不安全的下载”这类警告时,通常是因为Windows Defender SmartScreen或者其他安全功能认为下载的文件可能存在安全风险。对于软件开发者来说,大概率是由于软件没有进行数字签名,导致…

Java 中对象List 转map实践

class MyObject {Long id;String name;// Constructorpublic MyObject(Long id, String name) {this.id id;this.name name;}// Getterspublic Long getId() {return id;}public String getName() {return name;} }第一种 List 转 Map<Long, String> List<MyObject…

Codeforces Round 962 (Div. 3)

A题 Legs 题目&#xff1a; 农夫约翰的农场又迎来了美好的一天。 农夫约翰到达他的农场后&#xff0c;他数了数 n条 腿。众所周知&#xff0c;只有鸡和牛生活在农场&#xff0c;鸡有 2 条腿&#xff0c;而牛有 4 条腿 。 假设农场主约翰计算了所有动物的腿&#xff0c;他的…

2024安全大模型技术与市场研究报告

大模型驱动的AIGC引发技术革命&#xff0c;国资委强调国企需加大AI投入。大模型解决网络安全行业攻防不对等问题&#xff0c;国内外企业纷纷推出基于大模型的网络安全产品&#xff0c;AI将改变网络安全产品格局。 自 2022 年底开始&#xff0c;以 LLM(大语言模型&#xff0c;简…

magento2 安装win环境和linux环境

win10 安装 安装前提&#xff0c;php,mysql,apach 或nginx 提前安装好 并且要php配置文件里&#xff0c;php.ini 把错误打开 display_errorsOn开始安装 检查环境 填写数据库信息 和ssl信息&#xff0c;如果ssl信息没有&#xff0c;则可以忽略 填写域名和后台地址&#xff0…

tp5/6 查询MySQL某字段逗号分隔的数字与给定数组里的多个值匹配

记录&#xff1a;如果一个字段存储的是逗号分隔的数字&#xff0c;并且你希望查询这个字段中的值是否与给定数组中的任意元素相匹配&#xff0c;你可以考虑使用 SQL 的 FIND_IN_SET 函数配合循环构造动态查询条件。 示例 // 假设你的模型是 User&#xff0c;字段名为 id_list&…

创维汽车滁州永通体验中心开业仪式暨超充车型区域上市会圆满成功

2024年7月20日&#xff0c;创维汽车滁州永通体验中心盛大开业&#xff0c;当日&#xff0c;创维汽车市场部经理周世鹏、安徽大区总监王大明等领导参加本次开业盛典&#xff0c;共同见证创维汽车滁州永通体验中心成功落地。 2021年&#xff0c;新能源乘用车高速发展&#xff0c;…

两数相加(LeetCode)

题目 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不会以…

大数据——Hive原理

摘要 Apache Hive 是一个基于 Hadoop 分布式文件系统 (HDFS) 的数据仓库软件项目&#xff0c;专为存储和处理大规模数据集而设计。它提供类似 SQL 的查询语言 HiveQL&#xff0c;使用户能够轻松编写复杂的查询和分析任务&#xff0c;而无需深入了解 Hadoop 的底层实现。 Hive…

基于MindSpore Quantum的Grover搜索算法和龙算法

前言 Grover搜索算法&#xff0c;这是一种利用量子状态叠加性进行并行计算并实现加速的算法。Grover搜索算法解决了无序数据库搜索问题&#xff0c;其时间复杂度远低于经典算法&#xff0c;展示了量子计算的强大性能。文章还将通过两个小例子展示如何利用MindSpore Quantum实现…

C# Web控件与数据感应之 填充 HtmlTable

C# Web控件与数据感应之 填充 HtmlTable 在C#中&#xff0c;特别是在ASP.NET Web Forms应用中&#xff0c;你可能会遇到需要将数据动态填充到HTML表格&#xff08;HtmlTable&#xff09;中的场景。这通常涉及到遍历数据源&#xff08;如数据库查询结果、集合等&#xff09;&am…

C#中的new以及类

new关键字的用法 实例化对象&#xff1a;使用 new 关键字可以创建一个类的实例。例如&#xff1a; ​ MyClass obj new MyClass(); 指定构造函数&#xff1a;如果类有多个构造函数&#xff0c;可以使用 new 关键字指定使用哪一个构造函数来创建对象。例如&#xff1a; ​ MyC…

基于 HTML+ECharts 实现智慧运维数据可视化大屏(含源码)

智慧运维数据可视化大屏&#xff1a;基于 HTML 和 ECharts 的实现 在现代企业中&#xff0c;运维管理是确保系统稳定运行的关键环节。随着数据量的激增&#xff0c;如何高效地监控和分析运维数据成为了一个重要课题。本文将介绍如何利用 HTML 和 ECharts 实现一个智慧运维数据可…

IPython的Bash之舞:%%bash命令全解析

IPython的Bash之舞&#xff1a;%%bash命令全解析 IPython的%%bash魔术命令为Jupyter Notebook用户提供了一种在单元格中直接执行Bash脚本的能力。这个特性特别适用于需要在Notebook中运行系统命令或Bash特定功能的场景。本文将详细介绍如何在IPython中使用%%bash命令&#xff…