一. 什么是Gauge
Gauge是一款用于编写和运行验收测试的BDD框架 ,它有如下的特点:
使用Markdown的简单、灵活的语法来描述行为
支持多平台(Windows、Linux、macOS)、多语言(C#、Java、Javascript、Python、Ruby)
支持插件扩展
支持数据驱动和外部数据源(CSV文件)
支持VS Code
其中使用Markdown语法描述行为,算是Gauge最特殊的地方了,接下来我们将对其做一详细的说明,包括环境准备、项目初始化、用例编写、数据驱动、运行、测试报告等。
二. 环境准备
1.安装Python
python安装比较简单,这里不做叙述。唯一需要注意的是要求python版本>=2.7
2.下载 gauge-1.1.1-windows.x86_64.exe
下载地址:https://github.com/getgauge/gauge/releases,安装比较简单,一路点击下一步,最后将gauge.exe所在路径配置环境变量。在cmder中输入gauge -v,有输出版本信息时,说明已经安装成功
3.安装VS Code插件
在VS Code里安装gauge插件
三. 项目初始化
在E盘的virtual_workshop目录下,创建一个gauge_study的项目目录,切换到该目录,使用命令 gauge init python 初始化项目
初始化做了一些目录分层、环境配置等工作,并且给出了一个样例(见example.spec、step_iml.py),这是一个关于英语单词中元音字母统计的项目
下面解释一下各个目录的作用:
env:环境配置目录
logs:日志目录
specs:描述行为的目录,这里存放的spec文件,使用MarkDown语法编写
step_impl:实现目录,使用python或其他语言来执行spec文件中描述的行为
四. 用例编写
1.编写描述文件
既然是行为驱动,肯定是先有行为的描述,再有行为的实现。因此如何编写spec文件来描述行为,如何实现这些行为至关重要。现在有一个需求是这样的:
需求描述
要测试一个姓名的类型和长度,姓名类型一般是字符串,姓名长度是各个字符的总和
测试姓名类型
姓名"xxxx"的类型是"string"
测试姓名长度
姓名"xxxx"的长度是"4"
在specs目录下,创建一个name.spec的描述文件,使用MarkDown的语法来实现是这样的
首先解释一下编写描述文件的规则。在以往的测试用例中,都有测试套件、测试集合、测试场景、测试步骤的概念,这个概念同样适用于Gauge。你可以把Specs目录理解为测试套件,它下面的每一个spec文件都是一个测试集合,每个测试集合里包含着一个或多个测试场景,每个测试场景中又包含着一个或多个测试步骤。这样理解的话,很多东西一目了然
接着,我们结合例子具体讲下描述文件spec文件的基本写法
(1). 测试集合Spec
spec文件开始的标志,只能有一个。每个Spec至少包含一个测试场景Scenario,具体写法是 "# 描述",当然下面也可以加上注释。这个主要描述了测试的功能模块,比如姓名功能
# Name
This is a spec file that describe name type and length
(2).测试场景Scenario
每个Scenario至少包含了一个测试步骤Step,具体的写法是"## 描述"。这个主要描述了测试场景,比如要测试姓名的类型、长度,是对功能模块的分解
## Test name type
* The type of "Beck" must be "string"
(3).测试步骤Step
测试步骤里可以包含测试数据"Beck"和期望结果"string",也可以不包含,具体的写法是"* 描述",每个步骤是对测试场景的分解
## Test name type
* The type of "Beck" must be "string"
2.编写实现方法
描述文件准备好后,需要有语言的实现,描述文件和实现方法的关系,简单归纳一下是这样的:
如上图所示,每一个测试方法都是对测试步骤描述的实现,只需要定义一个方法,就可以实现这个步骤。但问题来了,对于有测试数据和期望结果的步骤,我们应该怎么表示?很简单,所有的实参的位置都用<变量名>表示即可,步骤只负责描述,具体获取数据、处理数据、提取实际结果、断言等逻辑由测试方法来实现,这里有些数据分离的感觉了
基于这一思路,在step_impl目录下创建一个name_impl.py模块,接着从getgauge.python模块中引入step方法,然后编写测试方法test_name_type和test_name_length,在测试方法上面加上@step装饰器,装饰器里的参数是描述里的内容,只不过使用<参数名>做了参数化,装饰器里的参数可以传递给测试方法
五. 数据驱动
假设我们要对多个姓名做测试,显然写一行一行的步骤描述,定义一个一个的测试方法是不现实的,因此需要用到数据驱动。Gauge里支持表格和csv文件,我们先来看看表格:
1.表格
需要在描述文件name.spec中定义表格。表格作为步骤来看待,需要先准备好对应的场景和步骤
在name.spec中实现表格批量遍历的方法 test_all_names_by_table,给它加上装饰器@step(),装饰器的参数同样是描述步骤中的内容"All names that have type and length",只不过还要在后面加上变量
,变量table表示表格对象,因此参数是"All names that have type and length "
那么表格中的每一个值怎么遍历呢?使用table.get_column_values_with_name(列名),可以得到对应列的每个值组成的可迭代对象,然后使用for循环依次遍历
2.CSV文件
在gauge_study项目下新建一个resources目录,用来存放csv文件,可以定义一个names.csv文件,存放我们的测试数据
接着在描述文件name.spec中添加描述,和表格一样要设置场景和步骤,然后需要在步骤描述里加一个csv文件地址的引用
最后在name_impl.py中实现csv数据的描述步骤,创建一个方法test_all_names_by_csv_file,加装饰器@step,参数就是描述的一部分"All names that supply by
"。这里需要注意的是,table表示csv对象,对table进行遍历得到的是每一行的数据,比如第一行的 ["Beck", "string", "4"],将这个可迭代对象的元素进行分解,依次赋值给name, type, length,就拿到了csv文件中的每一个值
六. 运行
到此为止,我们自己写了4条用例,一起来总结下:
用例
方法
数据存放位置
备注
测试单个名字的类型
test_name_type(name, type)
描述文件name.spec
测试单个名字的长度
test_name_length(name, type)
描述文件name.spec
测试多个名字的类型和长度(表格)
test_all_names_by_table(table)
描述文件name.spec
table.get_column_values_with_name(列名)的使用
测试多个名字的类型和长度(csv文件)
test_all_names_by_csv_file(table)
resources目录下的names.csv
1.描述文件中csv路径的引用
2.遍历table得到每一行的数据
怎么运行这些用例?gauge提供了很多方法,包括:批量运行所有的spec文件,运行特定的spec文件,运行特定的spec文件下特定的scenario
1.运行所有的spec文件
方法:gauge run
或 gauge run specs
为什么这里有6条用例呢?因为它把官方的样例也运行了,所以多了2条出来
2.运行特定的spec文件
如果只想运行name.spec下的4条用例,需要加上指定的spec文件名
方法:gauge run specs/name.spec
可以看到只运行了4条用例
3.运行特定的spec文件下的特定的scenario
name.spec下有个4个场景,对应4个用例,如果此时只想运行其中一个场景,比如说读取表格数据的那个场景,这时候应该怎么写呢?
方法:gauge run specs/name.spec:13
这个13是什么?实际上是name.spec文件中对应场景的行号
可以看到,只运行了一个场景Test multiple names by table
七. 测试报告
运行之后,会自动生成一个reports目录,index.html就是最终的测试报告,其相对路径是:reports/html-report/index.html
使用浏览器打开报告,感觉"颜值"还可以,这里都运行成功了。怎么样?这样方便快捷的BDD自动化测试框架你不打算试一下?
作 者:Beck
出 处:微信公众号:自动化软件测试平台
版权说明:欢迎转载,但必须注明出处,并在文章页面明显位置给出文章链接
你可能感兴趣的:(一款使用MarkDown描述的自动化神器Gauge)
我用DeepSeek写代码一周后,发现了这些惊人的秘密
fangwulongtian
python 开发语言 人工智能
大家好,我是武哥。作为一名有着10年开发经验的程序员,最近我深度体验了DeepSeek的代码能力,不得不说,这款国产大模型给了我太多惊喜。今天,我要和大家分享使用DeepSeek一周以来的心得体会,以及我发现的一些不为人知的"秘密武器"。1.惊人发现一:超强的代码理解能力1.1精准的代码解析先看一个实际案例:# 一个较为复杂的Python类class DataProcessor: def _
36.Web前端网页制作 NBA体育主题网页设计实例 大学生期末大作业 html+css+js
d321654987123
体育 前端 课程设计 html html5 javascript css jquery
目录一、前言二、网页文件三、网页效果四、代码展示1.HTML2.CSS3.JS五、更多推荐一、前言本实例以“体育”NBA为主题设计,应用html+css+js,包括图片轮翻效果、视频、表单等,12个子页面,代码简洁明了,供大家参考。【关注作者|获取更多源码(2000+个Web案例源码)|优质文章】;您的支持是我创作的动力!【点赞收藏博文】,Web开发、课程设计、毕业设计有兴趣的联系我交流分享,3Q
制造企业智慧物流架构解决方案
有限无限资料库
智能制造 数字化 制造 架构
本文档主要内容如下:1.物流4.0与智慧物流物流4.0:作为工业4.0的重要组成部分,物流4.0强调通过信息化和智能化手段,实现物流供应链的高效协同和优化。智慧物流:利用物联网、大数据、云计算等技术,实现物流过程的自动化、智能化和可视化,提升物流效率和服务质量。2.未来企业核心竞争力:高效物流供应链协同核心环节:涵盖采购物流、生产物流、销售物流、供应网络、智能制造和分销网络。目标:通过高效的供应链
Effective Objective-C 2.0 读书笔记——协议和分类
小鹿撞出了脑震荡
objective-c 分类 ios
EffectiveObjective-C2.0读书笔记——协议和分类文章目录EffectiveObjective-C2.0读书笔记——协议和分类在分类中添加属性使用“class-continuation分类”隐藏实现细节通过协议提供匿名对象在分类中添加属性尽管从技术上说,分类里也可以声明属性,但这种做法还是要尽量避免。原因在于,除了class-continuation分类之外,其他分类都无法向类中
Linux Media 子系统 V4l2
aningxiaoxixi
camera linux 服务器 网络
一创建V4l2的entity在Linux内核的MediaController框架中,V4L2设备作为实体(entity)的注册过程涉及以下步骤:1.初始化MediaController结构驱动首先创建一个media_device实例,并与V4L2设备(如v4l2_device)关联。例如:structmedia_device*mdev=devm_kzalloc(dev,sizeof(*mdev),
远程分布式 IO 模块中的数字量模块:工业自动化的 “神经末梢”
明达技术
分布式 自动化 运维
在工业自动化的宏大舞台上,远程分布式IO模块正扮演着越来越关键的角色,而其中的数字量模块更是如同“神经末梢”,敏锐地感知和传递着工业生产中的各种状态信息。今天,就让我带您走进远程分布式IO模块中数字量模块的世界,揭开它神秘的面纱。数字量模块:精准感知与传递的使者数字量,简单来说,就是只有两种状态的量,比如开关的开与关、电机的启动与停止、阀门的打开与关闭等。数字量模块的核心任务,就是准确地采集这些数
tortoisegit push 时提示 git did not exit cleanly (exit code 1)
**Dragon**
Git 冲突解决 合并 提交 远程仓库
我看了一些人把这个问题搞得很玄学,没有一点关键点,所以写了这篇,希望对你们有用。英文版的是这样的这个问题的本质是有修改没有提交,或者有更新没有拉取,拉取之后可能没有提交的问题我这边是在提交本地修改前,有其他人在这个分支提交了修改到远程仓库,导致我要push到远程仓库的时候冲突了,所以提示didnotexitcleanly。这是要合并上个人提交到这个分支的修改setting=>merge之后可能会有
微信小程序 navigator 和 wx.navigateTo不跳转问题
**Dragon**
小程序 前端
这个问题可能是很多新手会遇到的问题,有经验的人一眼就能看出问题了1、先确保app.js已经注册了页面路径2、索要跳转的页面不是tabBar,tabBar也可以设置open-type="switchTab"跳转3、我们来一起分析下先看有问题的代码,看起来很正常//wxml更多>>因为用navigator跳转不了,我尝试用wx.navigateTo,wx.navigateTo({url:url,eve
【CXX】1 CXX主要概念概览
Source.Liu
CXX rust CXX c++
本文描述了CXX(一个用于在Rust和C++之间进行桥接的库)中的关键概念,特别是FFI(外部函数接口)边界所涉及的三种主要类型:共享结构体、不透明类型和函数。一、示例代码#[cxx::bridge]modffi{//任何共享结构,其字段对两种语言都是可见的。structBlobMetadata{size:usize,tags:Vec,}extern"Rust"{//两种语言都可以传递零个或多个不
linux 查看设备中的摄像头&迅速验证设备号
Tipriest_
Ubuntu YOLO目标检测 linux 摄像头 图像处理
通常,摄像头在系统中会被识别为/dev/video*设备文件,比如/dev/video0、/dev/video1等。用户可能有多个摄像头,比如内置摄像头和外接USB摄像头,这时候每个摄像头会被分配不同的设备号。1.列出所有摄像头设备方法1:使用v4l-utils工具安装v4-utilssudoapt-getinstallv4l-utils列出所有视频设备v4l2-ctl--list-devices
对JVM的错误理解与纠正
众乐乐_2008
面试 jvm
从程序的角度我来整理一下,先是程序有通过类加载器加载字节码到JVM,然后初始化变量,通过执行引擎开始运行,在方法中放的是方法、类和静态变量和常量,然后cpu从方法区获取指令,然后从栈桢的局部变量中获取参数的变量名,从程序计数栈中去运行临时变量,冲动态绑定中过去获取引用的方法和字符串,然后方法执行完后,返回记录当前方法调用者的地址继续从方法区获取指令,继续获取指令并执行。然后附加信息是处理异常和JI
深入剖析 Burp Suite:Web 应用安全测试利器
垚垚 Securify 前沿站
十大漏洞 网络 前端 web安全 安全 系统安全
目录前言一、BurpSuite简介二、功能组件详解三、使用场景四、安装与使用步骤安装步骤使用步骤五、总结前言在网络安全的复杂版图中,BurpSuite宛如一颗璀璨的明珠,以其强大的功能和广泛的适用性,成为众多安全从业者不可或缺的得力助手。无论是为了保障企业级Web应用上线前的安全无虞,还是在渗透测试中探寻潜在的安全隐患,亦或是在安全研究领域开拓创新,BurpSuite都扮演着举足轻重的角色。接下来
Express 中间件分类
yqcoder
vue.js 前端 javascript
一、按功能用途分类1.应用级中间件这类中间件应用于整个Express应用程序,会对每个进入应用的请求进行处理。通过`app.use()`方法挂载,可用于执行一些全局性的任务,像日志记录、请求预处理、设置响应头这类操作。constexpress=require("express");constapp=express();//记录请求日志的应用级中间件app.use((req,res,next)=>{
python学习环境
HelloWorld!
python使用 python
python学习环境python的安装Anaconda的安装Anaconda虚拟环境pythonIDE的选择pycharm项目的环境变量选择从这篇文章开始,记录python学习的过程。本篇从python学习的环境开始展开。python的安装我主要是在windows环境下进行python3的学习。我所了解到主要有两种常见的python安装方法。直接在python官方网站上下载python,然后进行安
分布式存储--大规模订单架构设计
梦江河
大数据 分布式 订单系统 大数据
架构一:MySQL+HBase+ElasticsearchMySQL存储实时订单,HBase存储历史订单,Elasticsearch实现订单的多维度搜索。架构复杂,运维维护成本高架构二:MySQL+TablestoreTablestore其实是HBase+Elasticsearch,既能存储大量数据,也能全文搜索架构三:分布式数据库TiDB+全文搜索功能参考文章
mysql用函数调用存储过程_mysql 函数 调用 存储过程
weixin_39585974
mysql用函数调用存储过程
Mysql高级之存储过程原文:Mysql高级之存储过程概念类似于函数,就是把一段代码封装起来,当要执行这一段代码的时候,可以通过调用该存储过程来实现.在封装的语句体里面,可以用if/else,case,while等控制结构.可以进行sql编程.在mysql中,存储过程和函数...文章杰克.陈2014-11-14657浏览量Mysql函数(function)|存储过程(procedure)funct
mysql调用存储函数语法_MySQL调用存储过程和函数
weixin_39979332
mysql调用存储函数语法
MySQL调用存储过程和函数用call和你过程名以及一个括号,括号里面根据需要,加入参数,参数包括输入参数、输出参数、输入输出参数。具体的调用方法可以参看上面的例子。1.调用存储过程存储过程是通过CALL语向进行调用的,语法如下:CALLsp_name([parameter[,...]])CALL语句调用一个先前用CREATEPROCEDURE创建的存储过程,其中sp_name为存储过程的参数。【
Redis在京东到家的订单中的使用
weixin_33948416
数据库 java 大数据
背景Redis作为一款性能优异的内存数据库,在互联网公司有着多种应用场景,下面介绍下Redis在京东到家的订单列表中的使用场景。主要从以下几个方面来介绍:订单列表在Redis中的存储结构Redis和DB数据一致性保证Redis中的分布式锁缓存防穿透和雪崩订单列表在Redis中的存储结构订单列表数据在缓存中,是以用户的唯一标识作为键,以一个按下单时间倒序的有序集合为值进行存储的。大家都知道Redis
git的基本操作
NeoFive
git使用 git
教程地址:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b0001.安装linuxinstallgit:sudoapt-getinstallgitinstallwithsource:先从Git官网下载源码,然后解压,依次输入:./config,make,sudomakeinstall这几
Bengio新作Aaren:探索Transformer性能与RNN效率的融合
AI记忆
深度 学习论文与相关应用 transformer rnn 深度学习 Aaren Bengio
论文链接:https://arxiv.org/pdf/2405.13956一、摘要总结:本文提出了一种新的注意力机制,名为Aaren,它将注意力视为一种特殊的递归神经网络(RNN),能够高效地计算其多对一RNN输出。Aaren不仅能够并行训练,而且能够在推理时高效地更新新令牌,仅需要常数内存。实验表明,Aaren在四个流行的序列问题设置(强化学习、事件预测、时间序列分类和时间序列预测)的38个数据
python原生代码中的列表,元组和数组的区别,一个表格搞明白
涛涛讲AI
AI编程 效率工具 python 开发语言
经常搞混,以备后用。在Python原生代码里,数组一般是指由array模块创建的数组,下面以表格形式呈现列表、元组和array模块数组的区别:在Python原生代码里,数组一般是指由array模块创建的数组,下面以表格形式呈现列表、元组和array模块数组的区别:对比维度列表(list)元组(tuple)数组(array.array)定义语法使用方括号[]定义,元素间用逗号分隔。示例:my_lis
数据结构-链表【chapter1】【c语言版】
躺不平的理查德
数据结构 数据结构 链表 c语言 visual studio 开发语言
目录1链表的优势:2链表的组成:3.一般使用结构体的形式来实现链表:4.单向链表实现(创建,遍历,释放):4.1代码关键点备注:5.查找节点:5.1.按值查找节点5.2.按位置查找节点5.3查找是否存在某个值5.4.查找链表中最后一个节点5.5查找链表中倒数第k个节点6.删除节点6.1删除头节点6.2删除尾节点6.3.删除指定位置的节点6.4.删除指定值的节点6.5.释放整个链表1链表的优势:动态
c/c++--静态变量和静态函数(static)
躺不平的理查德
c/c++对比 c语言 c++ 算法
目录1c++静态函数和静态变量1.1C++静态成员函数:1.1.1定义与基本语法1.1.2不依赖于实例1.1.3访问限制1.1.4共享数据1.1.5作用域与命名1.1.6工厂函数和工厂方法(常用途)1.2c++静态函数()1.3c++静态变量2c语言静态变量:2.1静态局部变量和静态全局变量:2.2静态函数1c++静态函数和静态变量1.1C++静态成员函数:1.1.1定义与基本语法在C++中,使用
C++--this关键字
躺不平的理查德
c++ c++ 开发语言 1024程序员节 c语言 学习
目录1.this关键字的解释2.this关键字的使用2.1访问当前对象的成员和解决命名冲突。2.2链式调用3.this关键字总结3.1.常量指针3.2.在静态成员函数中不可用3.3this指向3.1.this在继承关系中的指向3.2.this在派生类中的指向3.3.基类指针或引用访问基类成员1.this关键字的解释在C++中,this关键字是一个指针,指向当前对象的地址。它在类的成员函数中使用,提
git bash常用命令
qq_37457269
git bash elasticsearch
GitBash是一个用于在Windows上执行Git命令的命令行工具,它提供了一个类似于Linux的终端环境,允许用户执行各种Git操作。以下是一些常用的GitBash命令及其说明:配置相关gitconfig--globaluser.name“YourName”:设置全局用户名。gitconfig--globaluser.email“youremail@example.com”:设置全局用户邮箱。
利用Infinity Embeddings创建文本嵌入
qahaj
python
技术背景介绍在自然语言处理(NLP)任务中,文本嵌入是一种将文本数据转换成固定维度向量的技术。这些向量能够捕捉文本之间的语义关系,使得在后续的任务(如文本分类、相似度计算等)中非常实用。Infinity嵌入模型是一种能够方便创建高质量文本嵌入的现代工具。核心原理解析InfinityEmbeddings利用强大的预训练模型,通过对输入的文本数据进行编码,生成具有语义意义的高维向量。这个过程不仅仅是简
Uniswap V3:流动性提取和收集
OpenBuild.xyz
Uniswap 人工智能 智能合约 web3 区块链 去中心化
作者:WongSSH引言本系列文章将带领读者从零实现UniswapV3核心功能,深入解析其设计与实现。主要参考了Constructor|UniswapV3CoreContractExplained系列教程、UniswapV3DevelopmentBook和Paco博客中的相关内容。所有示例代码可在clamm代码库中找到,以便实践和探索。流动性提取和收集进行流动性的提取实际上就是mint函数的反向操
仅用10张图片,AI就能学会识别万物?多模态小样本学习颠覆传统!
沃恩智慧
人工智能 深度学习 人工智能 学习 深度学习
小样本学习与多模态结合是当前人工智能领域的热门研究方向,旨在通过结合多模态数据(如视觉、语言、音频等)来提高模型在数据稀缺情况下的学习效率和性能。例如,ZS-DeconvNet方法在Nature上发表,展示了其在极低训练数据需求下,将图像分辨率提升超过1.5倍衍射极限的能力。此外,CPE-CLIP和MMFL等方法通过利用预训练模型和冻结的大规模视觉语言模型,实现了跨会话的迁移学习和快速适应新样本。
网络工程师 (38)流量和差错控制
IT 青年
软考网络工程师 软考 网络工程师
一、流量控制流量控制是一种协调发送站和接收站工作步调的技术。它的主要目的是防止发送端发送数据过快,导致接收端缓冲区溢出,从而造成数据丢失。流量控制机制通过调整发送速率来匹配接收端的处理能力。基本原理发送站每发出一帧数据,就进入等待状态。接收站收到数据后,进行简单的处理,然后送回一个应答信号(ACK)。发送站收到应答信号后,才能继续发送下一帧数据。常见协议停等协议:发送站发出一帧数据后等待接收站的应
发文新思路!双通道CNN的惊人突破,准确率接近100%!
沃恩智慧
深度学习 人工智能 cnn 人工智能 神经网络
双通道CNN作为一种创新的卷积神经网络架构,正引领深度学习领域的新趋势。其核心优势在于并行卷积层设计,能够同时处理更多特征信息,从而显著提升模型的特征表示能力和识别精度。这种架构不仅提高了计算效率,还有效降低了过拟合风险,使其在复杂视觉任务中表现卓越。例如,最新的研究提出了一种名为DDTransUNet的混合网络,结合了Transformer和CNN的优势,通过双分支编码器和双重注意力机制,有效解
springmvc 下 freemarker页面枚举的遍历输出
杨白白
enum freemarker
spring mvc freemarker 中遍历枚举
1枚举类型有一个本地方法叫values(),这个方法可以直接返回枚举数组。所以可以利用这个遍历。
enum
public enum BooleanEnum {
TRUE(Boolean.TRUE, "是"), FALSE(Boolean.FALSE, "否");
实习简要总结
byalias
工作
来白虹不知不觉中已经一个多月了,因为项目还在需求分析及项目架构阶段,自己在这段
时间都是在学习相关技术知识,现在对这段时间的工作及学习情况做一个总结:
(1)工作技能方面
大体分为两个阶段,Java Web 基础阶段和Java EE阶段
1)Java Web阶段
在这个阶段,自己主要着重学习了 JSP, Servlet, JDBC, MySQL,这些知识的核心点都过
了一遍,也
Quartz——DateIntervalTrigger触发器
eksliang
quartz
转载请出自出处:http://eksliang.iteye.com/blog/2208559 一.概述
simpleTrigger 内部实现机制是通过计算间隔时间来计算下次的执行时间,这就导致他有不适合调度的定时任务。例如我们想每天的 1:00AM 执行任务,如果使用 SimpleTrigger,间隔时间就是一天。注意这里就会有一个问题,即当有 misfired 的任务并且恢复执行时,该执行时间
Unix快捷键
18289753290
unix Unix;快捷键;
复制,删除,粘贴:
dd:删除光标所在的行 &nbs
获取Android设备屏幕的相关参数
酷的飞上天空
android
包含屏幕的分辨率 以及 屏幕宽度的最大dp 高度最大dp
TextView text = (TextView)findViewById(R.id.text);
DisplayMetrics dm = new DisplayMetrics();
text.append("getResources().ge
要做物联网?先保护好你的数据
蓝儿唯美
数据
根据Beecham Research的说法,那些在行业中希望利用物联网的关键领域需要提供更好的安全性。
在Beecham的物联网安全威胁图谱上,展示了那些可能产生内外部攻击并且需要通过快速发展的物联网行业加以解决的关键领域。
Beecham Research的技术主管Jon Howes说:“之所以我们目前还没有看到与物联网相关的严重安全事件,是因为目前还没有在大型客户和企业应用中进行部署,也就
Java取模(求余)运算
随便小屋
java
整数之间的取模求余运算很好求,但几乎没有遇到过对负数进行取模求余,直接看下面代码:
/**
*
* @author Logic
*
*/
public class Test {
public static void main(String[] args) {
// TODO A
SQL注入介绍
aijuans
sql注入
二、SQL注入范例
这里我们根据用户登录页面
<form action="" > 用户名:<input type="text" name="username"><br/> 密 码:<input type="password" name="passwor
优雅代码风格
aoyouzi
代码
总结了几点关于优雅代码风格的描述:
代码简单:不隐藏设计者的意图,抽象干净利落,控制语句直截了当。
接口清晰:类型接口表现力直白,字面表达含义,API 相互呼应以增强可测试性。
依赖项少:依赖关系越少越好,依赖少证明内聚程度高,低耦合利于自动测试,便于重构。
没有重复:重复代码意味着某些概念或想法没有在代码中良好的体现,及时重构消除重复。
战术分层:代码分层清晰,隔离明确,
布尔数组
百合不是茶
java 布尔数组
androi中提到了布尔数组;
布尔数组默认的是false, 并且只会打印false或者是true
布尔数组的例子; 根据字符数组创建布尔数组
char[] c = {'p','u','b','l','i','c'};
//根据字符数组的长度创建布尔数组的个数
boolean[] b = new bool
web.xml之welcome-file-list、error-page
bijian1013
java web.xml servlet error-page
welcome-file-list
1.定义:
<welcome-file-list>
<welcome-file>login.jsp</welcome>
</welcome-file-list>
2.作用:用来指定WEB应用首页名称。
error-page1.定义:
<error-page&g
richfaces 4 fileUpload组件删除上传的文件
sunjing
clear Richfaces 4 fileupload
页面代码
<h:form id="fileForm"> <rich:
技术文章备忘
bit1129
技术文章
Zookeeper
http://wenku.baidu.com/view/bab171ffaef8941ea76e05b8.html
http://wenku.baidu.com/link?url=8thAIwFTnPh2KL2b0p1V7XSgmF9ZEFgw4V_MkIpA9j8BX2rDQMPgK5l3wcs9oBTxeekOnm5P3BK8c6K2DWynq9nfUCkRlTt9uV
org.hibernate.hql.ast.QuerySyntaxException: unexpected token: on near line 1解决方案
白糖_
Hibernate
文章摘自:http://blog.csdn.net/yangwawa19870921/article/details/7553181
在编写HQL时,可能会出现这种代码:
select a.name,b.age from TableA a left join TableB b on a.id=b.id
如果这是HQL,那么这段代码就是错误的,因为HQL不支持
sqlserver按照字段内容进行排序
bozch
按照内容排序
在做项目的时候,遇到了这样的一个需求:
从数据库中取出的数据集,首先要将某个数据或者多个数据按照地段内容放到前面显示,例如:从学生表中取出姓李的放到数据集的前面;
select * fro
编程珠玑-第一章-位图排序
bylijinnan
java 编程珠玑
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.Random;
public class BitMapSearch {
Java关于==和equals
chenbowen00
java
关于==和equals概念其实很简单,一个是比较内存地址是否相同,一个比较的是值内容是否相同。虽然理解上不难,但是有时存在一些理解误区,如下情况:
1、
String a = "aaa";
a=="aaa";
==> true
2、
new String("aaa")==new String("aaa
[IT与资本]软件行业需对外界投资热情保持警惕
comsci
it
我还是那个看法,软件行业需要增强内生动力,尽量依靠自有资金和营业收入来进行经营,避免在资本市场上经受各种不同类型的风险,为企业自主研发核心技术和产品提供稳定,温和的外部环境...
如果我们在自己尚未掌握核心技术之前,企图依靠上市来筹集资金,然后使劲往某个领域砸钱,然
oracle 数据块结构
daizj
oracle 块 数据块 块结构 行目录
oracle 数据块是数据库存储的最小单位,一般为操作系统块的N倍。其结构为:
块头--〉空行--〉数据,其实际为纵行结构。
块的标准大小由初始化参数DB_BLOCK_SIZE指定。具有标准大小的块称为标准块(Standard Block)。块的大小和标准块的大小不同的块叫非标准块(Nonstandard Block)。同一数据库中,Oracle9i及以上版本支持同一数据库中同时使用标
github上一些觉得对自己工作有用的项目收集
dengkane
github
github上一些觉得对自己工作有用的项目收集
技能类
markdown语法中文说明
回到顶部
全文检索
elasticsearch
bigdesk elasticsearch管理插件
回到顶部
nosql
mapdb 支持亿级别map, list, 支持事务. 可考虑做为缓存使用
C
初二上学期难记单词二
dcj3sjt126com
english word
dangerous 危险的
panda 熊猫
lion 狮子
elephant 象
monkey 猴子
tiger 老虎
deer 鹿
snake 蛇
rabbit 兔子
duck 鸭
horse 马
forest 森林
fall 跌倒;落下
climb 爬;攀登
finish 完成;结束
cinema 电影院;电影
seafood 海鲜;海产食品
bank 银行
8、mysql外键(FOREIGN KEY)的简单使用
dcj3sjt126com
mysql
一、基本概念
1、MySQL中“键”和“索引”的定义相同,所以外键和主键一样也是索引的一种。不同的是MySQL会自动为所有表的主键进行索引,但是外键字段必须由用户进行明确的索引。用于外键关系的字段必须在所有的参照表中进行明确地索引,InnoDB不能自动地创建索引。
2、外键可以是一对一的,一个表的记录只能与另一个表的一条记录连接,或者是一对多的,一个表的记录与另一个表的多条记录连接。
3、如
java循环标签 Foreach
shuizhaosi888
标签 java循环 foreach
1. 简单的for循环
public static void main(String[] args) {
for (int i = 1, y = i + 10; i < 5 && y < 12; i++, y = i * 2) {
System.err.println("i=" + i + " y="
Spring Security(05)——异常信息本地化
234390216
exception Spring Security 异常信息 本地化
异常信息本地化
Spring Security支持将展现给终端用户看的异常信息本地化,这些信息包括认证失败、访问被拒绝等。而对于展现给开发者看的异常信息和日志信息(如配置错误)则是不能够进行本地化的,它们是以英文硬编码在Spring Security的代码中的。在Spring-Security-core-x
DUBBO架构服务端告警Failed to send message Response
javamingtingzhao
架构 DUBBO
废话不多说,警告日志如下,不知道有哪位遇到过,此异常在服务端抛出(服务器启动第一次运行会有这个警告),后续运行没问题,找了好久真心不知道哪里错了。
WARN 2015-07-18 22:31:15,272 com.alibaba.dubbo.remoting.transport.dispatcher.ChannelEventRunnable.run(84)
JS中Date对象中几个用法
leeqq
JavaScript Date 最后一天
近来工作中遇到这样的两个需求
1. 给个Date对象,找出该时间所在月的第一天和最后一天
2. 给个Date对象,找出该时间所在周的第一天和最后一天
需求1中的找月第一天很简单,我记得api中有setDate方法可以使用
使用setDate方法前,先看看getDate
var date = new Date();
console.log(date);
// Sat J
MFC中使用ado技术操作数据库
你不认识的休道人
sql mfc
1.在stdafx.h中导入ado动态链接库
#import"C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","end")2.在CTestApp文件的InitInstance()函数中domodal之前写::CoIniti
Android Studio加速
rensanning
android studio
Android Studio慢、吃内存!启动时后会立即通过Gradle来sync & build工程。
(1)设置Android Studio
a) 禁用插件
File -> Settings... Plugins 去掉一些没有用的插件。
比如:Git Integration、GitHub、Google Cloud Testing、Google Cloud
各数据库的批量Update操作
tomcat_oracle
java oracle sql mysql sqlite
MyBatis的update元素的用法与insert元素基本相同,因此本篇不打算重复了。本篇仅记录批量update操作的
sql语句,懂得SQL语句,那么MyBatis部分的操作就简单了。 注意:下列批量更新语句都是作为一个事务整体执行,要不全部成功,要不全部回滚。
MSSQL的SQL语句
WITH R AS(
SELECT 'John' as name, 18 as
html禁止清除input文本输入缓存
xp9802
input
多数浏览器默认会缓存input的值,只有使用ctl+F5强制刷新的才可以清除缓存记录。如果不想让浏览器缓存input的值,有2种方法:
方法一: 在不想使用缓存的input中添加 autocomplete="off"; eg: <input type="text" autocomplete="off" name