移动端自动化测试实战

news2024/12/23 16:50:46

UI自动化测试的价值


1、提升回归测试的效率
2、可以进行兼容性测试

UI 自动化测试应用场景

• 冒烟测试自动化:提测之前自动断言提测质量,提供准入参考。

• 功能测试自动化:辅助 QA 与测试工程师的快速验证。

• 验收测试自动化:兼容性测试等。

• 移动端性能专项测试自动化:性能、卡顿、健壮性测试、竞品分析。

测试框架

• 阿里 Macaca

• 腾讯开源微信小程序自动化测试工具

• 百度内部的 Cafe 框架

自动化测试常见误区

强调自动化测试不代表手工测试无用

• 手工测试非常有用,仅有手工测试是不够的。

• 手工测试 + 自动化测试才是企业快速迭代的根基

UI 自动化测试的“瓶颈”

• 技术成本高:

• 人力成本高:优秀测试开发工程师难招

• 技术门槛高:80%的自动化测试工程师在自动化能力上都不及格

• 维护成本高

• 复用率不高:UI 和业务流程变更是最主要变更

• 稳定性不足:容易被干扰,执行慢

• 常见行业错误观点

• 错误观点一:UI 自动化测试无用论

• 错误观点二:UI 自动化测试只能模拟人工

合理地使用 UI 自动化

• 使用分层测试策略,控制 UI 自动化测试规模:

• 少数核心用例交给自动化测试

• 大部分的基础回归测试交给自动遍历

• 新功能测试交给人工测试

• 技术改进方案:

• 良好的维护模型:PageObject、数据驱动

• 更好的框架支持:增加 Watch,智能等待,失败重试等机制

自动化测试就是机器点点点?

• 传统自动化测试

• 自动探索测试 自动化对新功能进行测试?

• codeless 方向的自动化测试  不需要写代码就可以完成自动化测试

• 自动化测试用例智能生成 

如何高效实用的落地自动化

• 学习方向

• 了解待测产品和平台:Android、iOS、App

• 精通最好的测试框架:Appium、UI Automator、WebDriverAgent

• 掌握自动化测试落地经验:PageObject、稳定性提升、数据驱动……

• 达到的结果

• 一天搞定一款 app 的自动化测试脚手架

• 一天完成单个功能的业务测试自动化用例集合

• N 周内搞定公司的 app 自动化测试

移动自动化测试的技术体系

UI 自动化分类

• Web 自动化:Selenium

• App 自动化:Appium

• GUI 自动化:Windows、Mac

• 微信小程序自动化:App + Web 测试技术的外延形态

• 更多平台:智能设备、机器人、工业 app

UI 自动化测试方面的成就

• Google:Espresso、UI Automator

• Facebook:WebDriverAgent

• 焰焮ibaba:Macaca

• Ebay:Selendroid

• Walmart:Robotium

• Sauce Labs:Appium

• ThoughtWorks:Selenium

Appium

Appium 的设计理念

Appium client:对应语言的client包和脚本,如python的Appium-Python-Client并编写脚本

Appium server:启动服务开放端口,接收appium client客户端的http请求

driver:appium需要driver来驱动移动端,Appium team目前维护了很多driver,需要根据平台来选择driver。Android平台一般使用Uiautomator2 driver。。IOS使用XCUITest driver

 

自动化测试框架选择

• 推荐 Appium

• 跨语言:Java、Python、Node.js 等

• 跨平台:Andoid、iOS、Windows、Mac

• 底层多引擎可切换

• 生态丰富,社区强大

• iOS:KIF、WDA、XCTest

• Android:Robotium、UI Automator

• 特色框架:calabash、Macaca、ATX

Appium 引擎列表

• Android

• Selendroid、Espresso [推荐]

• UI Automator、UI Automator2 [推荐]

• iOS

• UI Automation [已废弃]

• XCUITest [推荐]

• 更多平台:Mac、Windows、游戏引擎等

Appium 多端架构与自动化

UI 分层测试体系

移动 App 分层测试

 移动 App 快速迭代模型

自动遍历测试与其价值

• 定义:以自动化的方式对 app 进行充分的功能遍历以探索 bug

• 价值

• 降低自动化维护成本,可替代 80% 的自动化测试

• 实现新功能的探索

• 实现老功能的回归

• 用途:多设备兼容测试、自动化专项测试

常见遍历工具与技术

• Android 原生 Monkey

• 百度 SmartMonkey

• 腾讯 New Monkey

• 阿里 Macaca 的 NoSmoke

• TesterHome 社区 vigossjjj smart_monkey

• TesterHome 社区 zhangzhao Maxim

• TesterHome 社区 seveniruby AppCrawler

• Google 出品的 App Crawler

合理的使用 UI 自动化

• 单元测试:使用 App 分层测试策略,增加单测规模,控制 UI 自动化测试规模。

• 移动 App 自动化测试:核心集成与验收测试用例交给自动化测试。

• 自动遍历测试:大部分的基础回归测试交给自动遍历。

• 人工测试:测试团队主负责,整个产品团队参与。

Android app 的常见概念

Android 自动化前提依赖

• Android SDK:Android Studio 可辅助安装

• 模拟器

• Android Studio 自带 Emulator [推荐]

• Genymotion、网易 MuMu、BlueStacks

• 真机

获取 App 的信息

• App 信息

• 获取当前界面元素:adb shell dumpsys activity top

• 获取任务列表:adb shell dumpsys activity activities

• App 入口

• adb logcat |grep -i displayed

adb logcat | findstr Displayed  (windows cmd用这个)

• aapt dump badging mobike.apk | grep launchable-activity

• apkanalyzer 最新版本的 SDK 中才有

• 启动应用

 Android 调试桥 adb 命令详解

环境准备

• 真机 or 模拟器

• 下载 Android SDK

• 设置 PATH 变量加入 SDK 的工具目录

Android 常用命令

• adb:Android Debug Bridge

• adb devices:查看设备

• adb kill-server:关闭 adb 的后台进程

• adb tcpip:让 Android 脱离 USB 线的 TCP 连接方式

• adb connect:连接开启了 TCP 连接方式的手机

• adb logcat:Android 日志查看

• adb bugreport:收集日志数据,用于后续的分析,比如耗电量

adb shell

• adb shell 本身就是一个 Linux 的 shell,可以调用 Android 内置命令

• adb shell

• adb shell dumpsys

• adb shell pm

adb shell pm clear com.android.contacts

 

 清除包的缓存数据和权限,获得一个比较新的环境。

• adb shell am

 • adb shell am start -W -n  com.android.contacts/.activities.PeopleActivity -S

• adb shell ps

• adb shell monkey

常用命令列表

• adb

• pm 包管理工具

• am  启动一个APP

• dumpsys 获取整个系统的性能数据

• uiautomator  获取APP的界面结构,执行自动化测试 

• input 完成简单的自动化指令

Android 性能统计 dumpsys

• 获取所有的 dumpsys 子命令 dumpsys | grep -i DUMP

• 获取当前 activity adb shell dumpsys activity top

• 获取 activities 的记录,可以获取到 appium 依赖的原始 activity dumpsys activity activities

• 获取特定包基本信息 adb shell dumpsys package com.xueqiu.android

• 获取系统通知 adb shell dumpsys notification

• 获得内存信息 adb shell dumpsys meminfo com.android.settings

• 获取 cpu 信息 adb shell dumpsys cpuinfo

• 获取 gpu 绘制分析 adb shell dumpsys gfxinfo com.android.settings

• 获取短信 adb shell dumpsys activity broadcasts | grep senderName=

uiautomator

• adb shell uiautomator runtest ...

运行自动化测试用例

• adb shell uiautomator dump

adb shell uiautomator dump

 把Android APP控件生成xml文件

UiAutomator是测试Android原生态APP的功能测试工具。Android 4.1发布时包含了这种新的测试工具—UiAutomator。UiAutomator用来做UI功能测试的。

uiautomator2是uiautomator的升级版,uiautomator是Google开发的一款用来做安卓自动化测试的Java库。适用于Android4.4+

简单的自动化工具 input 命令

• text (Default: touchscreen)

• keyevent [--longpress] ... (Default: keyboard)

• tap (Default: touchscreen)

adb shell input tap 529 1176

点击屏幕上该坐标  

• swipe [duration(ms)] (Default: touchscreen)

• draganddrop [duration(ms)] (Default: touchscreen)

• press (Default: trackball)

• roll (Default: trackbal

Appium 架构介绍

文档:The Context API - Appium Documentation

Appium 生态工具

• adb:Android 的控制工具,用于获取 Android 的各种数据和控制

• Appium Desktop:内嵌了 Appium Server 和 Inspector 的综合工具

• Appium Server:Appium 的核心工具,命令行工具

• Appium Clients:各种语言的客户端封装库,用于连接 appium server

• Java、Python、Ruby、robotframework-appium

• AppCrawler 自动遍历工具

Desktop 主要功能

• UI 分析

• 录制用例

• 元素查找测试

• Attach 已有的 session

• 云测试

python 客户端安装

• 客户端安装:pip install Appium-Python-Client

• IDE:PyCharm

• Python 多版本隔离工具:venv

• 国内依赖源:http://pypi.douban.com/simple/

• 测试框架:unittest、pytest、nose,推荐 pytest

APP自动化

控件定位方法

常用定位手段

• id

• Accessibility ID

• XPath

元素定位

• 测试步骤三要素:

• 定位、交互、断言

• 定位

• ID (重要)

• XPath(重要)

• Accessibility ID: content-desc(重要)

• 不推荐:Class -iOS -Android

常用自动化 API

常见自动化动作支持

• click

• sendKeys

• swipe

• touch action

手势操作 TouchAction

• press release longPress

• tap wait

• moveTo

• perform

capabilities 设置

Capabilities - Appium Documentation

Capabilities是appium启动server会话时设置的参数,告诉server需要启动的APP入口,android版本等信息。

• App APK 地址 appPackage 包名 appActivity Activity 名字

• automationName 默认使⽤ uiautomator2

• noReset fullReset 是否在测试前后重置相关环境

• autoGrantPermissions ⾃动赋予 App 权限

• unicodeKeyBoard resetKeyBoard 是否需要输⼊⾮英⽂之外的语⾔并在测试完成后重置输⼊法

 Appium 设备交互 API

可见Appium Python Client 文档Welcome to Appium python client’s documentation! — Python client 1.0 1.0 documentation

常用的设备交付命令

• 模拟电话、短信

用下面的命令模拟 GSM 电话和短信,注意:只能在模拟器上使用!

self.driver.make_gsm_call("5551234567", GsmCallActions.CALL);
 
self.driver.send_sms('555-123-4567', 'Hey lol')
 

Original error: gsmCall method is only available for emulators 这里在夜神模拟器上执行是失败的。

• 横竖屏切换

• App 处理

# 实现 APP 的安装
self.driver.install_app('/Users/johndoe/path/to/app.apk') 
 
# 检测 APP 是否被安装
self.driver.is_app_installed('com.example.AppName');
 
# 启动 APP
self.driver.launch_app()
 

• 键盘、粘贴板

设置系统剪贴板的内容:

self.driver.set_clipboard('happy testing')
self.driver.set_clipboard_text('happy testing')
 
获取到剪贴板的内容:

self.driver.get_clipboard()
self.driver.get_clipboard_text()

• 录屏

显式等待

• 功能差别

• 显式等待的条件非常灵活

• 隐式等待只用于元素定位

• 执行差别

• 显式等待本地轮询条件

• 隐式等待通过 appium server 轮询条件

def assert_exist_element(self,loc):
    try:
        WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located(loc))
        return True
    except:
        print("元素{}不存在".format(loc))
        return False

XPath 介绍

• 绝对定位:根据严格的父子关系定位

• 相对定位:根据条件匹配定位

• 慢的原因:XPath 定位比其他定位慢,因为需要递归解析每个元素的属性

• 慢的不明显的原因:有 Cache 机制

常用 XPath 相对定位表达式

• 查找:

• //*[@text='登录’]

• //*[contains(@resource-id, 'login’)]

• 条件匹配:

• //*[contains(@resource-id, ‘login’) and contains(@text, ‘登录’)]]

• //*[contains(@text, ‘登录’) or contains(@label, '登录’)]]

• 寻找所有元素://*

Toast 识别方法

• automationName:uiautomator2

• getPageSource 是无法找到的

• 必须使用 xpath 查找

• 推荐 //*[@class= ‘android.widget.Toast']

• 或者 //*[contains(@text, "xxxxx")]

断言体系

元素是否存在:find_elements

assert len(self.driver.find_elements(by=AppiumBy.XPATH, value='//*[@text="Battery"]'))>=1 #断言存在该元素
assert "哈哈" in self.driver.find_element(by=AppiumBy.XPATH, value='//*[@text="Battery"]').text

• 元素属性正确性:get_attribute

xUint常用断言

传统的xUnit风格的assertXXX()系列

Hamcrest断言,基于更灵活的Matchers断言方式 --推荐 https://github.com/hamcrest/PyHamcrest

参数化与数据驱动

参数化

• 参数化:根据传入的数据,对测试用例进行迭代调用

• 数据驱动:基于数据完成流程调度,通常数据来源自外部数据文件

• 参数化是数据驱动的基础和特例

数据驱动

• 参数化数据读取自外部文件:使用 YAML、JSON 读取

• 测试步骤读取自外部文件:定制执行引擎

• 断言步骤读取自外部文件:定制执行引擎

• 整个用例读取自外部文件:动态创建用例

Native 原生 App 的自动化测试

多种架构支持

Native 原生应用的分类

• Android 标准组件

• 非标准组件:

• Flutter:闲鱼

• React Native:Facebook

• Weex:极客时间

• 游戏

非标准控件的特征

• 非 WebView 组件

• 原生控件可识别

• HTML 控件被编译为 Native 控件

• HTML 的文本属性被解析为 Native 属性

• text 还是 content-desc 取决于 API 版本

常见 Native 自动化测试方式

• Android 原生组件:Appium 默认支持

• Native非标准组件:Appium默认支持

• 自定义 View 识别:

• 使用相对定位,父控件加百分比偏移

• OCR、图像识别、AI

• 游戏控件识别:使用游戏引擎特定技术

游戏自动化测试支持

• Appium 提供了简单的游戏自动化测试支持

• 图像识别

• AI 识别

• 游戏测试的推荐做法

• 提高可测性:编码输出游戏引擎下的控件布局信息,与 Appium 对接

• 使用成熟的 airtest 框架

Hybrid 混合 App 的自动化测试

WebView 控件在 Appium 中的抽象

• Native 层面支持

• uiautomator 解析 WebView 中的内容并映射为原生控件

• getPageSource 为 DOM 结构可发现 WebView 组件和控件

• 切换为 WebView 上下文

• 切换后才是正规的 Web

• getPageSource 为 HTML

• 可以使用 CSS 定位等

Hybrid 测试流程

• 首先进去带有 WebView 的页面

• 使用 Contexts API 寻找 WebView

• 使用 Context 切换到 WebView

• 使用 CSS 等 Web 定位方式

• 使用 Context 重回 Native

真机进行 WebView 测试的前提

• 模拟器默认支持

• 物理机需要打开 app 内开关

• 检测是否打开:反编译检查对应的 API 调用

 WebView 测试 - Python

找对 ChromeDriver 的版本

• Android 默认浏览器:

• 老版本 Android 用 Browser,新版本 Android 用 Chrome

• adb shell dumpsys package com.android.webview | grep versionName

• adb shell dumpsys package com.android.chrome | grep versionName

• App 自带 WebView 组件:每个 App 自带的 WebView 的版本也都不相同

Android WebView进程信息

• getContextHandles

• 查看所有的 WebView 进程

• adb shell cat /proc/net/unix | grep webview

• Context 切换

• 把 domain socket 映射为本地的 socket 端口

• adb forward tcp:$port localabstract:webview_devtools_remote_$pid

• 获取对应的 WebView 组件版本 http://localhost:$port/json/version

• ChromeDriver 协议交互

设置 ChromeDriver

• ChromeDriver 安装

• 提前下载所有的 ChromeDriver 版本备用

• 运行时指定

• 隐式选择:1.8版本以后支持自动选择 ChromeDriver

• 显式指定:chromedriverExecutableDir 设置

• 调试开关:

• showChromedriverLog

纯 H5 站自动化测试

浏览器自动化技术原理

浏览器调试工具 DevTools

 对网站进行分析

 移动浏览器测试 - Python

 

 小程序自动化测试

小程序自动化的三个方法

• 利用 Uiautomator 的原生定位

• 利用微信提供的小程序自动化 SDK

• 基于WebView的测试方法

基于原生定位的方法

• Appium 使用 Uiautomator2 定位可以识别内部 WebView 组件

• 缺点:元素定位符不够精确,content-desc、resource-id 多数都没有

• NoReset 默认为 false,会默认清空微信聊天记录,所以请使用测试机测试帐号

基于微信提供的小程序自动化 SDK

• 使用 Node.js 体系

• 微信小程序自动化 SDK + 标准的测试框架

• 支持真机与 Web 模拟器

微信小程序自动化 SDK 的缺点

• 从官网提供的代码示例来看,微信的这套体系主要用于研发自测

• 微信的研发对自动化测试理解不到位,大量的 wait,实用性不高

• 需要在已有的 WebSocket 体系上做二次封装对接 Appium

• 希望微信可以重视这块的测试支持改进

基于 WebView 的测试方法

• 微信6.x版本支持基于 WebView 自动化测试

• 7.x改版后默认已经无法使用基于 WebView 的自动化

• 7.x + root强行开启 WebView debug + Appium hack

• 曾经这个方案是最好用的,Appium 默认支持

• 但是当前微信版本里这个方法已经被破坏,绕过条件比较苛刻,暂时不可用了

Page Object 模式

做法

• 以页面为单位独立建模

• 隐藏实现细节

• 本质是面向接口编程

• 优点

• 减少重复 find click 样板代码

• 易读性提高

• 页面修改不影响测试用例

Page Object 六大设计原则

登录场景

• 登陆页面提供 login findPassword 功能

• Login 类 + login findPassword 方法

• 登录页面内的元素有多少并不关心,隐藏内部界面控件

• 登录成功和失败会分别返回不同的页面

• findPassword

• loginSuccess

• loginFail

• 通过方法返回值判断登录是否符合预期

编写用例顺序

• 根据界面封装 page 类与方法,实现可以为空

• 编写用例,不断重构明确 page 里方法的入参和返回值

• 开始实现 page 内的方法

• 调试

BasePage 封装

• 实现通用的 Page 方法,对常用自动化行为做封装

• 管理各种 Driver

• 减少每个 Page 对 Appium、Selenium 等库的太多依赖

自动化行为封装

• 异常弹框处理:广告、好评、升级、tips 等弹框

• 通用自动化能力封装

基于 POM 的用例组织结构

• page:完成对页面的封装

• driver:完成对 Web、Android、iOS、接口的驱动

• testcase:调用各类 page 完成业务流程并进行断言

• data:配置文件和数据驱动

• utils:其他便捷的功能封装,可选

测试用例管理

• 用例组织结构:

• 使用 package 管理业务模块

• 使用 class 管理业务对象、使用method完成业务具体行为

• 数据驱动:测试数据、测试步骤、测试断言

• 测试用例:

• 使用 testcase 完成测试步骤的定义

• 使用 assertion 完成业务正确性校验

• 持续集成:使用 Jenkins 完成持续集成

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/852056.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大模型AI人才培养研习会,上海、武汉站同期招募!

伴随预训练大语言模型技术引发的产业变革,市场对AI人才需求也同样发生着深刻变化,教育迎来了新的机遇与挑战。由中国自动化学会主办,百度公司联合知名高校承办的大模型AI人才培养研习会,首场将于8月19日在武汉、上海双城同期举办&…

python安装xgboost报错

ERROR: Could not find a version that satisfies the requirement xgboost (from versions: none) ERROR: No matching distribution found for xgboost 解决办法: 换成国内的pip源 pip install xgboost -i http://pypi.doubanio.com/simple/ --trusted-host py …

python3学习--使用pandas 数据透视表分析数据--入门示例

什么是透视表? 透视表是一种可以对数据动态排布并且分类汇总的表格格式,可以以多种方式和视角查看数据特征 Pandas库提供了一个名为pivot_table的函数,它将一个特性的值汇总在一个整洁的二维表中。 使用示例 pivot_table函数说明 pandas.…

没有硬核技术,怎么抓得住元宇宙的风口?

自 2021 年起,Web 3.0 与元宇宙逐步成为全球科技界的热门概念。Web 3.0 是技术发展方向的未来,元宇宙是应用场景和生活方式的未来,二者之间是相辅相成、一体两面的依存关系。科技巨头如 Meta、谷歌、苹果、华为、腾讯、OPPO 等均已在积极布局…

7.3 详解NiN模型--首次使用多层感知机(1x1卷积核)替换掉全连接层的模型

一.前提知识 多层感知机:由一个输入层,一个或多个隐藏层和一个输出层组成。(至少有一个隐藏层,即至少3层) 全连接层:是MLP的一种特殊情况,每个节点都与前一层的所有节点连接,全连接…

stm32项目(6)——基于stm32的人体检测系统

目录 1.功能设计 2.硬件方案 1.单片机选择 2.人体传感器 3.报警模块 3.程序设计 4.课题意义 5.未来发展 1.功能设计 本系统为日常生活而开发的人体感应报警系统,主体通过HC-SR501模块达到感知人体靠近,检测到人体后单片机控制蜂鸣器和LE…

MyBatis动态sql标签帮你轻松搞定sql拼接

动态sql介绍 由于在开发过程不同的业务中会用到不同的操作条件,如果每个业务都拼接不同sql语句的话会是一个庞大的工作量;此时动态sql就能解决这个问题,可以针对不确定的操作条件动态拼接sql语句,根据提交的条件来完成业务sql的执…

【LeetCode 75】第二十四题(2390)从字符串中移除星号

目录 题目: 示例: 分析: 代码运行结果: 题目: 示例: 分析: 题目给我们一个字符串,然后字符串中包含星号*,要求每个星号消除一个从星号左边起最近的一个字符&#xf…

随着野火的增加,甲烷排放也会增加

2020 年对加利福尼亚州造成严重破坏的野火使大气中充满了强效温室气体。 2020 年,溪火烧毁了北加州的内华达山脉。图片来源:Zachary Cava/Flickr,CC BY-NC-SA 2.0 2020 年,在高温和干旱的推动下,加州野火烧毁了超过160…

揭示CTGAN的潜力:利用生成AI进行合成数据

推荐:使用 NSDT场景编辑器 助你快速搭建可编辑的3D应用场景 我们都知道,GAN在生成非结构化合成数据(如图像和文本)方面越来越受欢迎。然而,在使用GAN生成合成表格数据方面所做的工作很少。合成数据具有许多好处&#x…

Ae 效果:CC Spotlight

透视/CC Spotlight Perspective/CC Spotlight CC Spotlight(CC 聚光灯) 主要用途是创建和控制逼真的聚光灯效果。通过调整这些属性,可以模拟出各种不同的照明环境和效果,比如舞台照明、日出日落、特定的颜色照明等。 ◆ ◆ ◆ 效…

儿童台灯什么光源好?如何挑选儿童护眼台灯

很多家长有时候会说孩子觉得家里的台灯灯光刺眼,看书看久了就不舒服。这不仅要看光线亮度是否柔和,还要考虑台灯是不是有做遮光式设计。没有遮光式设计的台灯,光源外露,灯光会直射孩子头部,孩子视线较低,很…

c语言——字符串函数和内存操作函数

深度学习字符串函数和内存操作函数 一、求字符串长度函数(strlen)二、长度不受限制的字符串函数2.1字符串拷贝函数(strcpy)2.2字符串连接函数(strcat)2.3字符串比较函数(strcmp) 三、…

Smart HTML Elements 16.1 Crack

Smart HTML Elements 是一个现代 Vanilla JS 和 ES6 库以及下一代前端框架。企业级 Web 组件包括辅助功能(WAI-ARIA、第 508 节/WCAG 合规性)、本地化、从右到左键盘导航和主题。与 Angular、ReactJS、Vue.js、Bootstrap、Meteor 和任何其他框架集成。 智…

thinkphp:分组查询(多条相同列的数据只展示一条)

例子:数据库中有trans_num、subinventory_from、transaction_type、creation_date有相同值,在查询该数据库使,只展示这几个值相同的一条 效果: 限制之前 限制之后 代码 限制前,后端代码 public function select_i…

使用威胁建模进行DevSecOps实践丨IDCF

作者: 姚圣伟(现就职天津引元科技 天津市区块链技术创新中心) 研发效能(DevOps)工程师认证学员 一、从DevOps到 DevSecOps DevOps 最开始最要是强调开发和运维的协作与配合,至今,已不仅仅涉…

第3章 数据和C

本章介绍以下内容: 关键字:int 、short、long、unsigned、char、float、double、_Bool、_Complex、_Imaginary 运算符:sizeof() 函数:scanf() 整数类型和浮点数类型的区别 如何书写整型和浮点型常数,如何声明这些类型的…

在windows中使用parLapply函数执行并行计算

目录 1-lapply()函数介绍: 例子1: 例子2: 例子3: 2-在Windows使用并行计算,使用parLapply()函数 2.1-并行计算的准备阶段: 2.2-parLapply()函数介绍 2.3-使用parLapply()函数编写执行并行计算 2.4-…

领航优配:医药股发力拉升,双成药业等涨停,科源制药等大涨

医药股8日盘中拉升走高,到发稿,科源制药涨超16%,盘中一度冲击涨停;北陆药业涨超10%,精华制药、双成药业、海欣股份、奇特制药、龙津药业、永安药业等涨停,诚达药业、特一药业涨逾8%。 音讯面上,…

《实战AI模型》:GPT语义缓存为什么用GPTCache而不是Redis?

为什么不是Redis? 验证完可行性,便到了搭建系统的环节。这里我有一点必须要分享,在搭建 ChatGPT 缓存系统时,Redis 并不是我们的首选。 个人而言,我很喜欢用 Redis,它性能出色又十分灵活,适用于各种应用。但是 Redis 使用键值数据模型是无法查询近似键的。 如果用户提…