开发背景在开发一个 PyQt 应用程序时,我们经常需要执行一些耗时的操作,例如文件读写、网络请求、复杂的数据处理或长时间的计算。如果这些操作在主线程中执行,会导致用户界面(UI)冻结,用户无法与应用程序进行交互,影响用户体验。为了解决这个问题,我们需要将这些耗时操作放在单独的线程中执行。
然而,直接使用多线程会带来一些复杂性,例如线程的创建、管理、信号和槽机制的使用,以及在多线程环境下处理异常和结果的传递等。为了简化这些操作,因此开发了 Task 和 TaskManager 类。
功能实现123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990from PyQt5.QtCore import QThread, pyqtSignalclass Task(QThread): ""&q ...
代码片段
未读基础类执行终端命令1234567891011def subPopen(cmd: Union[str, list], shell: bool = True, encoding: str = "utf-8", errors: str = "ignore") -> str: """ 执行cmd命令,返回命令执行结果 :param cmd: 命令 :param shell: 是否使用shell :param encoding: 编码 :param errors: 错误处理方式 :return: 命令执行结果 """ _r = subprocess.Popen(cmd, shell=shell, stdout=subprocess.PIPE) return _r.stdout.read().decode(encoding, errors=errors)
网络类获取当前wifi1234567891011121314151617def ...
开发背景在开发自动化测试工具时,我们经常面临对测试用例进行循环压力测试的需求。由于测试类的重复编写工作量较大,因此计划开发一个抽象基类来简化这一过程。
测试流程测试流程大致如下图所示。
在整个测试流程中存在一个大循环(circle)。首先,执行带有@BeforeClass注解的方法;接着,针对每个测试用例(即带有@Test注解的方法)进行循环测试,在每个测试用例的循环内部,又有一个针对该测试用例自身的循环次数(count)。在这个内部循环中,首先执行带有@Before注解的方法,然后执行具体的测试逻辑,最后执行带有@After注解的方法。
测试结果通过TestResult存储单个测试结果的信息,包括如下内容:
Id:唯一标识
Circle:测试循环次数
Case:测试用例名称
Description:测试用例描述
Count:测试用例执行次数
Status:测试状态,成功/失败
Message:失败时的错误信息
功能实现测试属性123456789101112131415/// <summary>[test]</summary>[Attribut ...
Android中APK部分信息通过adb无法直接获取,可以通过Android中的ApplicationInfo进行获取。
获取内容
packageName:包名
appName:用户可见的名称
isSystemApp:是否是系统应用
launcherActivity:启动的活动名
processName:运行的进程的名称
compileSdkVersion:编译SDK版本
targetSdkVersion:目标SDK版本
icon:图标数据
功能实现权限1234567<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" tools:ignore="QueryAllPackagesPermission" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32& ...
在Android自动化测试中,通过自动化测试脚本填充联系人、通话记录、短信等数据,可以模拟出更接近真实用户的使用场景。这种模拟有助于发现那些在日常使用中才会出现的问题,从而提高测试的全面性和准确性。
联系人权限读写联系人需要以下权限,直接动态申请即可
12<uses-permission android:name="android.permission.READ_CONTACTS"/><uses-permission android:name="android.permission.WRITE_CONTACTS"/>
填充方法1234567891011121314151617181920212223242526272829private boolean insertContacts(String names, String num) { // 创建一个操作列表 ArrayList<ContentProviderOperation> ops = new ArrayList<>( ...
代码片段
未读添加依赖在build.gradle中添加uiautomator依赖
1androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0'
编写用例需要在androidTest中编写用例,而不是在main中。新建一个test类,下面是一个打开设置的一个测试。
12345678910111213141516171819202122232425package com.tt.demo; import androidx.test.ext.junit.runners.AndroidJUnit4;import androidx.test.platform.app.InstrumentationRegistry;import androidx.test.uiautomator.By;import androidx.test.uiautomator.UiDevice;import androidx.test.uiautomator.UiObject2; import org.junit.Test;impo ...
在 WPF 中,数据绑定是一种强大的机制,用于将 UI 元素(如TextBox、Button等)与数据对象进行关联。
INotifyPropertyChanged接口允许数据对象在其属性值发生改变时通知 UI,从而使 UI 能够自动更新以反映最新的数据状态。
优势
自动更新 UI:当数据变化时,UI 自动刷新(无需手动调用 setText 或 update)
减少样板代码:避免手动同步数据和控件状态
支持 MVVM 模式:在 WPF 中,数据绑定是 MVVM(Model-View-ViewModel)的核心
数据验证 & 格式化:自动处理输入验证、数据转换(如日期格式化)
ToolMainWindow中实现ToolMainWindow.xaml.cs
12345678910111213141516171819202122232425262728public partial class ToolMainWindow : UserControl, INotifyPropertyChanged{ private int _co ...
代码片段
未读开发背景在 Android 自动化测试体系中,ADB(Android Debug Bridge) 作为连接 PC 与移动设备的关键纽带,发挥着不可或缺的作用。在实际操作中,我们需频繁调用各类 ADB 命令,但每一次调用都涉及指令发送、结果回传以及结果解析处理等一系列繁杂流程。为简化操作流程、提升测试效率,我对常用的 ADB 指令进行了系统性封装 。
功能实现12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214 ...
代码片段
未读开发背景执行终端指令,并返回结果
功能实现12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879public class NProcess{ /// <summary> /// 执行cmd命令 /// </summary> /// <param name="command">cmd命令</param> /// <param name="useUTF8">是否使用utf-8编码</param> /// <returns>包含命令执行结果的Process对象</returns> public static Process Run(string co ...
代码片段
未读开发背景对http请求进行简单封装
功能实现123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126public class Requests{ /// <summary> /// 异步发送GET请求并返回响应内容。 /// </summary> /// <param name="url">请求的URL。</param> /// <param name="timeout"> ...