首页 文章 精选 留言 我的

精选列表

搜索[自动化工具],共10000篇文章
优秀的个人博客,低调大师

KiCad 5.1.9 发布,电子设计自动化软件包

KiCad 5.1.9现已发布,这是 5 系列的最新稳定版本。5.1.9 版本是基于5.1分支创建,其中包含了一些来自开发分支的更改。 自先前版本以来,5.1.9 稳定版本包含了一些重要的错误修复和其他较小的改进。还包括改进的封装、符号和3D模型库、翻译和文档。感兴趣的用户可在KiCad 5.1.9 里程碑页面上查看自 5.1.8 版本以来所有已修复错误的列表。 官方表示,此版本包含一些关键的错误修复,因此请用户考虑尽快升级。适用于 Windows、MacOS 和 Linux 的软件包下载可参阅KiCad 下载页面。 值得注意的是,从 5.1.7 版本开始,KiCad 不再支持早于 Mojave 10.14 的 macOS。 详情可查看官方博客:https://kicad.org/blog/2020/12/KiCad-5.1.9-Release/

优秀的个人博客,低调大师

连载|想用Python做自动化测试?彻底学会装饰器

“用好装饰器,才是真正的Python工程师。” 14.1 概念 所谓的装饰器,其实就是通过装饰器函数,来修改原函数的一些功能,使得原函数不需要修改。装饰器依赖前面介绍的Python函数的五个特性: 函数也是对象 函数对象可以赋值给变量 函数对象可以作为参数传递给另外的函数 函数对象可以作为另外一个函数的返回值 函数可以嵌套定义 14.2 函数装饰器 14.2.1 装饰器的简单例子 my_decorator() 是一个装饰器,它把真正需要执行的函数 func() 包裹在其中,并且改变了它的行为,但是原函数 func不变。定义装饰器分三步走: 调用原函数前后做一通操作 调用原函数 返回内部函数对象 def my_decorator(func): def wrapper(): print('wrapper of decorator') # ①这里做一通操作 func() # ②调用原函数 return wrapper # ③返回内部函数对象def greet(): print('hello world')greet = my_decorator(greet) # 变量 greet 指向了内部函数 wrapper()greet() # 调用 greet() 相当于执行内部函数wrapper@my_decorator # @语法糖,相当于greet1 = my_decorator(greet1)def greet1(): print('hello world') 14.2.2 装饰带有参数的函数 装饰器可以接受原函数任意类型和数量的参数,把*args和**kwargs,作为装饰器内部函数 wrapper() 的参数即可。 def my_decorator(func): # 这个func只是个参数,不一定是函数名。 def wrapper(*args, **kwargs): print('wrapper of decorator') # 这里做一通操作 func(*args, **kwargs) # 调用原函数 return wrapper # 返回内部函数对象@my_decoratordef greet(message): print(message)@my_decoratordef celebrate(name, message): print(name+message) 14.2.3 装饰器本身带有参数 它还可以接受自己定义的参数。举个例子,比如我想要定义一个参数,来表示装饰器内部函数被执行的次数,那么就可以写成下面这种形式:在外边再套一层函数,并返回内层函数。参考: def repeat(num): def my_decorator(func): def wrapper(*args, **kwargs): for i in range(num): print('wrapper of decorator') func(*args, **kwargs) return wrapper return my_decorator@repeat(4)def greet(message): print(message) 再看一个装饰器本身带参数的例子: def type_decorator(**kwargs): """检查实例属性类型的装饰器""" def decorate(cls): # 对instance进行装饰 for key, value in kwargs.items(): # 给cls的设置类属性,并给类属性设置描述符实例 setattr(cls, key, TypedAssertion(key, value)) return cls return decorate TypedAssertion是一个描述符。这个装饰器的目标是给cls类添加kwargs中的key作为类属性,将TypedAssertion描述符作为类属性的值。举个例子: @type_decorator(brand=str, shares=int, price=float)class Stock: def __init__(self, brand, shares, price): self.brand = brand self.shares = shares self.price = price 效果就是对brand、shares和price属性做了类型校验。 14.2.4 保留被装饰函数的元信息 在内部函数上面用装饰器@functools.wraps(func)。 import functoolsdef my_decorator(func): @functools.wraps(func) # 为了保留被装饰函数的元信息 def wrapper(*args, **kwargs): print('wrapper of decorator') func(*args, **kwargs) return wrapper @my_decoratordef greet(message): print(message) 14.3 类装饰器 这部分可以看完后面关于Python类的章节后再学习。类装饰器主要依赖于函数__call__,每当你调用一个类的实例时,__call__就会被执行。 这里,我们定义了类 Count,初始化时传入原函数 func(),而__call__函数表示让变量 num_calls 自增 1,然后打印,并且调用原函数,并返回原函数。 因此,在我们第一次调用函数 example() 时,num_calls 的值是 1,而在第二次调用时,它的值变成了 2。 class Count: def __init__(self, func): self.func = func self.num_calls = 0 def __call__(self, *args, **kwargs): self.num_calls += 1 # 调用次数加1 print('num of calls is: {}'.format(self.num_calls)) return self.func(*args, **kwargs)@Count # Count类装饰example,会调用Count类的__call__函数def example(): print("hello world")example()# 输出num of calls is: 1hello worldexample()# 输出num of calls is: 2hello world 14.4 装饰器的嵌套使用 函数可以被多个装饰器装饰,也就是下面这样: @decorator1@decorator2@decorator3def func(): ... 装饰器的执行顺序是从里到外,等效于decorator1(decorator2(decorator3(func)))。 14.5 实际应用场景 1.身份认证每次调用这个函数前,都会先检查用户是否处于登录状态,如果是登录状态,则允许这项操作;如果没有登录,则不允许。 import functoolsdef authenticate(func): @functools.wraps(func) def wrapper(*args, **kwargs): request = args[0] if check_user_logged_in(request): # 如果用户处于登录状态 return func(*args, **kwargs) # 执行函数post_comment() else: raise Exception('Authentication failed') return wrapper @authenticatedef post_comment(request, ...) ... 2.测试某些函数的执行时间 import timeimport functoolsdef log_execution_time(func): @functools.wraps(func) def wrapper(*args, **kwargs): start = time.perf_counter() res = func(*args, **kwargs) end = time.perf_counter() print('{} took {} ms'.format(func.__name__, (end - start) * 1000)) return res return wrapper @log_execution_timedef calculate_similarity(items): ... 3.输入合理性检查 import functoolsdef validation_check(input): @functools.wraps(func) def wrapper(*args, **kwargs): ... # 检查输入是否合法 @validation_checkdef neural_network_training(param1, param2, ...): ... 参考资料: https://foofish.net/python-decorator.html https://python3-cookbook.readthedocs.io/zh_CN/latest/c09/p11_write_decorators_that_add_arguments_to_functions.html 本文分享自微信公众号 - 明说软件测试(liuchunmingnet)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

优秀的个人博客,低调大师

一看就会:Python+Appium实现自动化测试

一、环境准备 1.脚本语言:Python3.x IDE:安装Pycharm 2.安装Java JDK 、Android SDK 3.adb环境,path添加E:\Software\Android_SDK\platform-tools 4.安装Appium for windows,官网地址http://appium.io/ 点击下载按钮会到GitHub的下载页面,选择对应平台下载 安装完成后,启动Appium,host和port默认的即可,然后设置Android SDk和Java JDK 然后点下边那个保存并重启的按钮,然后点第一个Start Server按钮,将会看到 二、真机测试 1.连接手机 打开开发者模式,USB线连接手机和电脑,并且在开发者选项当中,开启USB调试 测试是否连接成功,可执行命令adb devices 出现上图就证明手机和电脑连接成功。。。 2.点击Start Inspector Session 按如下配置Desired Capabilities platformName:声明是ios还是Android系统 platformVersion:Android内核版本号,可通过命令adb shell getprop ro.build.version.release查看 deviceName:连接的设备名称,通过命令adb devices -l中model查看 appPackage:apk的包名 appActivity:apk的launcherActivity,通过命令adb shell dumpsys activity | findstr “mResume”查看(需先打开手机应用) 注意:Android 8.1之前应使用adb shell dumpsys activity | findstr “mFocus” 3.运行Start Session,选择元素 右侧 Selected Element 区域有三个按钮 Tap:执行选中元素的点击事件 Send Keys:为文本框等对象传值 如果是文本输入元素,就清除文本 4.录制脚本 录制生成的python代码如下: # This sample code uses the Appium python client# pip install Appium-Python-Client# Then you can paste this into a file and simply run with Pythonfrom appium import webdrivercaps = {}caps["platformName"] = "Android"caps["platformVersion"] = "9.0.0"caps["deviceName"] = "Mi_Note_3"caps["appPackage"] = "com.antfortune.wealth"caps["appActivity"] = "com.alipay.mobile.quinox.LauncherActivity"caps["resetKeyboard"] = Truecaps["unicodeKeyboard"] = Truedriver = webdriver.Remote("http://localhost:4723/wd/hub", caps)el1 = driver.find_element_by_id("com.antfortune.wealth.login:id/login_main_button")el1.click()el2 = driver.find_element_by_id("com.alipay.mobile.accountauthbiz:id/auth_login_btn")el2.click()driver.quit() 5.在pycharm中建立项目将代码粘入,在运行之前,还需通过pip命令安装pip install Appium-Python-Client依赖包 最后,记一个我在这些过程中遇到的问题(现已解决) 在Appium-desktop中运行Start Session时,出现 解决方法:在开发者模式下,打开usb调试功能和use模拟点击,两个都要打开,此时再重新运行,即可解决 -END- 耐住寂寞,必有结果 本文分享自微信公众号 - 爱码小士(AIMA-1024)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

优秀的个人博客,低调大师

BigOps自动化运维安装以及所遇故障处理

本文参考官方文档进行安装,以及在安装中所遇到的问题呈现给大家。废话就不说了,开始安装。一、准备工作:本机系统环境是CentOS 7 x86 64位 硬件配置建议物理内存8G+、CPU 4 cores+、硬盘20G+。内存低于6G无法安装BigOps程序,所以内存必须6+。1.操作系统CentOS 7 x86 64位 (推荐使用7以上版本,使用7以下版本请参考官网文档)官方文档URL:http://docs.bigops.com/er-jin-zhi-an-zhuang/zhun-bei-huan-jing.html 服务 端口 统一认证 30000、30001 work后端 30002、30003 预留 30004、30005 dv后端 30006、30007 confluence 30008、30009 jira 30010、30011 jenkins 30012、30013 kibana 5601 cerebro 9000 elasticsearch-head 9100 elasticsearch 9200、9300 2.准备2域名(1)sso.xxxx.com,用于统一认证(2)work.xxxx.com,用于主站如果没有注册域名,需要给服务器和笔记本都配置hosts。Linux位置/etc/hosts。Windows位置C:\Windows\System32\drivers\etc\hosts,如果不能直接编辑,可以先拷贝到桌面,编辑完在拷贝回原位置。配置内容,例如:192.168.100.2 sso.bigops.com (换成你服务器IP和你自己的域名)192.168.100.2 work.bigops.com (换成你服务器IP和你自己的域名)切记2个域名都要设置!切记!切记!切记!切记服务器和你的笔记本都要设置!切记!切记!切记!3.初始化环境[root@localhost ~]#cd /usr/local/src[root@localhost src]# wget -O centos_init_env.sh https://raw.githubusercontent.com/yunweibang/bigops-install/master/centos_init_env.sh[root@localhost src]# chmod +x centos_init_env.sh[root@localhost src]# sh centos_init_env.sh 注:建议将所需下载的文件统一放在一个目录下,好管理也好处理。4.关闭IPv6(可选)centos 7编辑/etc/default/grub,在GRUB_CMDLINE_LINUX的值里添加ipv6.disable=1,例如:GRUB_CMDLINE_LINUX="ipv6.disable=1 crashkernel=auto rhgb quiet idle=halt biosdevname=0 net.ifnames=0 console=tty0 console=ttyS0,115200n8 noibrs"再运行命令[root@localhost ~]#grub2-mkconfig -o /boot/grub2/grub.cfg重启系统[root@localhost ~]#reboot5.获取安装包百度网盘地址:地址:https://pan.baidu.com/s/1y8JyQJIUWnzDiH0fX2EpcQ密码:76cm二、安装待初始化系统完成以后,我们进行BigOps环境和BigOps软件安装(1)安装MySQL(推荐使用)[root@localhost src]# wget -O mysql80.sh https://raw.githubusercontent.com/yunweibang/bigops-install/master/mysql80.sh[root@localhost src]#chmod +x mysql80.sh[root@localhost src]# sh mysql80.sh看到下面提示,输入root@127.0.0.1用户密码,保存好一会使用。另外root@localhost密码为空 please input root@127.0.0.1 password, default bigops/>输入你的密码优化MySQL,修改/etc/my.cnf里innodb_buffer_pool_size的值,用命令计算:说明:BigOps系统占用4G,所以innodb_buffer_pool_size等于总内存减去4G后的70%到80% [root@localhost ~]# free -g|egrep -i ^mem|awk '{if($2<7) print "memory is too small";else print int(($2-4)*0.8)"G"}' 比如上面命令返回8G,就这样设置:innodb_buffer_pool_size=8G修改完后需要重启MySQL(2) 安装BigOps程序[root@localhost src]#tar -zxvf bigops-1.0.1.tar.gz[root@localhost src]# mv bigops-1.0.1 bigops[root@localhost src]# cd bigops/bin/[root@localhost bin]# chmod +x bigserver.sh[root@localhost bin]# sh bigserver.sh根据提示填写相关信息,设置完后服务会自动启动。dbhost不要填localhost,填127.0.0.1或对应IP 检查BigOps数据库的tables是否是大小写组合拼写。如果表名都是小写就有问题如果不是请根据官方常见问题文档进行修改。URL:http://docs.bigops.com/er-jin-zhi-an-zhuang/an-zhuang-chang-jian-wen-ti.html检查服务端口有无启动[root@localhost bin]# netstat -nptl | grep 3000检查Nginx状态检查Nginx域名是否配置正确[root@localhost ~]#cat /etc/nginx/conf.d/sso.conf[root@localhost ~]#cat /etc/nginx/conf.d/work.conf[root@localhost bin]# ps aux|grep nginx.conf注:问题在此处我遇到sso.conf和work.conf、default.conf、zabbix.conf文件是空白的,服务重启后Nginx服务无法启动。解决下载配置文件,替换并修改sso.conf、default.conf、work.conf、zabbix.conf里的域名为你网站的域名[root@localhost ~]#wget -O /etc/nginx/nginx.conf https://raw.githubusercontent.com/yunweibang/bigops-install/master/nginx/nginx.conf [root@localhost ~]#wget -O /etc/nginx/conf.d/default.conf https://raw.githubusercontent.com/yunweibang/bigops-install/master/nginx/conf.d/default.conf [root@localhost ~]#wget -O /etc/nginx/conf.d/sso.conf https://raw.githubusercontent.com/yunweibang/bigops-install/master/nginx/conf.d/sso.conf [root@localhost ~]#wget -O /etc/nginx/conf.d/work.conf https://raw.githubusercontent.com/yunweibang/bigops-install/master/nginx/conf.d/work.conf [root@localhost ~]#wget -O /etc/nginx/conf.d/zabbix.conf https://raw.githubusercontent.com/yunweibang/bigops-install/master/nginx/conf.d/zabbix.conf替换修改后Nginx服务正常启动 检查sso服务是否正常启动[root@localhost bin]# curl 127.0.0.1:30001/signin/login如果返回值包括「sso系统正常」,说明运行正常,如果没有返回值说明有问题,需要详细检查数据库配置。检查work服务是否正常启动[root@localhost bin]# curl 127.0.0.1:30003/api/common/ssourl/{"code":0,"message":"ok","data":{"url":"http://sso.swwbigops.com"}}[root@localhost bin]# 如果返回「message」为ok就是正常启动bigserver,bigserver服务用于执行一些内置任务[root@localhost ~]#/usr/local/src/bigops/bin/bigserver.sh restartbigserver配置文件在/usr/local/src/bigops/bin/bigserver.properties可以根据需要调整轮询时间设置定时清理日志[root@localhost ~]#crontab -e 00 01 * /bin/sh /opt/bigops/bin/clean_log.sh 添加开机启动服务 [root@localhost ~]#wget -O /usr/lib/systemd/system/bigweb.service https://raw.githubusercontent.com/yunweibang/bigops-install/master/bigweb.service [root@localhost ~]#systemctl enable bigweb [root@localhost ~]#chmod 754 /usr/lib/systemd/system/bigweb.service [root@localhost ~]#wget -O /usr/lib/systemd/system/bigserver.service https://raw.githubusercontent.com/yunweibang/bigops-install/master/bigserver.service [root@localhost ~]#systemctl enable bigserver [root@localhost ~]#chmod 754 /usr/lib/systemd/system/bigserver.service [root@localhost ~]#systemctl enable nginx [root@localhost ~]#systemctl enable mysqld登录测试访问域名:http://work.swwbigops.com (就是你刚才设置的home url) 默认账号:admin 默认密码:bigops 登陆后请尽快修改密码。软件登录界面展示

优秀的个人博客,低调大师

码云Gitee对接华为云ContainerOps实现 DevOps 自动化

日前,码云 Gitee 已经完成了和华为云 ContainerOps 服务的对接,利用华为云平台赋能码云 Gitee 的 DevOps 能力。 你可以通过仓库的 DevOps 菜单进入 ContainerOps 服务,如下图所示: 目前该服务还处于公测阶段,华为云为所有码云的开发者免费提供 50 次的流水线执行,更多的配额可通过华为云平台购买。 详细的使用手册请看https://gitee.com/help/articles/4264 ---------- 华为云容器交付流水线(ContainerOps)以DevOps理念为基础,面向从源代码到生产上线全流程,提供代码编译、镜像构建、灰度发布、容器化部署等一系列服务,助力企业落地容器DevOps最佳实践。ContainerOps解决了容器化场景下从源码到镜像构建、镜像部署过程中的问题,进一步提升了研发、部署和运维效率。 图1容器交付流水线 ContainerOps 产品功能 提供容器化场景下的全流程CI/CD能力 ContainerOps提供容器化场景下的全流程CI/CD(持续集成/持续发布)能力,通过使用系统内置流水线或自定义流水线实现从源码到镜像构建、镜像部署的容器化流水线能力。 支持对接源码托管网站构建镜像 ContainerOps支持对接DevCloud、Gitee、GitHub、GitLab构建容器镜像,ContainerOps构建出的镜像存储在容器镜像服务中,可使用存储的镜像进行镜像部署。 提供灰度发布模式 ContainerOps提供灰度发布模式,您在正式升级现网版本之前,可以对业务集群的部分实例进行升级、验证,验证通过后再正式发布。 图2灰度发布 支持alpha-beta-gamma端到端敏捷交付 ContainerOps支持alpha-beta-gamma端到端敏捷交付,支持一套软件版本使用不同的配置,自动发布到alpha-beta-gamma环境中。每一条流水线独立管理一个(微)服务的生命周期,减少了跨(微)服务、跨DC/Region的操作耦合。 图3alpha-beta-gamma端到端敏捷交付 支持对接企业研发平台 ContainerOps提供全功能API,企业可自行对接内部研发平台,统一研发流程的管理入口,确保企业已有研发及流程操作习惯不变,复用已有资源,节约建设成本。 图4对接企业研发平台 更多关于华为云 ContainerOps 的介绍请看这里。

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册