项目背景
公司内部的软件采用B/S架构,大部分是数据的增删改查,由于还在开发阶段,所以UI界面的变化非常快,难以针对UI进行自动化测试,那样会消耗大量的精力与时间维护自动化脚本。针对此种情况,针对接口测试较为有效。
工具选择
针对接口测试的工具也很多,例如soup UI,robot framework,甚至jmeter这样的性能测试工具也可以进行接口测试。
robot framework测试框架有很多的第三方库可以使用,采用的是填表的方式进行,较容易上手,但是无法深入底层的了解客户端与服务器的交互过程。jmeter这样的专注性能测试的工具,进行接口测试,有点大材小用的感觉而且无法生成测试报告。
综上考虑,决定自己开发一个简单的框架,优点是足够灵活,可以随时根据需求进行变更,后台使用的是python flask进行开发,此次选用python 2.7.11进行框架的开发,python开发的速度很快,且容易上手,丰富的第三方库,大大加快了开发速度和难度。
框架思路
由于是框架,所以要考虑到框架的可重用性和可维护性。采用数据驱动的设计方式,将数据分层出来,与业务逻辑剥离。这样测试人员就可以通过数据文件专注的写测试用例,不用关注代码编写,提高了效率。此次框架采用基本的excel进行数据管理。通过对excel 的读取获得数据。
之后将测试的结果生成HTML格式的测试报告发送给相关开发人员。
第三方库介绍
Requests python中有许多针对http的库,例如自带的urllib2,但是自带的urllib2编写起来实在是太费精力,所以采用号称"HTTP for Humans"的requests库。
xlrd xlrd使得python可以方便的对excel文件进行读写操作,此次通过xlrd读取excel文件中的测试数据。
以上第三方库都可以通过pip直接安装或者通过pypi下载源码包安装。
模块介绍
get_conf:读取配置文件,获得邮件发送的配置信息,如smtpserver、receiver、sender等。
md5Encode:部分数据采用md5加密后传输,所以需要把从excel读取的数据进行md5加密。
sendMail:当测试完成后,将测试报告自动的发送给相关开发人员。
runTest:此部分读取excel中的数据,调用下方的interfaceTest方法,保存interfaceTest返回的信息。
interfaceTest:将runTest读取的excel数据作为入参,执行接口测试,并将后台返回的信息返回给runTest。
Excel
不知怎么图片一直上传失败,后面会将excel文件格式上传
代码实现
#通过自带的ConfigParser模块,读取邮件发送的配置文件,作为字典返回
import ConfigParser
def get_conf():
conf_file = ConfigParser.ConfigParser()
conf_file.read(os.path.join(os.getcwd(),'conf.ini'))
conf = {}
conf['sender'] = conf_file.get("email","sender")
conf['receiver'] = conf_file.get("email","receiver")
conf['smtpserver'] = conf_file.get("email","smtpserver")
conf['username'] = conf_file.get("email","username")
conf['password'] = conf_file.get("email","password")
return conf
#此处使用python自带的logging模块,用来作为测试日志,记录测试中系统产生的信息。
import logging,os
log_file = os.path.join(os.getcwd(),'log/sas.log')
log_format = '[%(asctime)s] [%(levelname)s] %(message)s'
logging.basicConfig(format=log_format, filename=log_file, filemode='w', level=logging.DEBUG)
console = logging.StreamHandler()
console.setLevel(logging.DEBUG)
formatter = logging.Formatter(log_format)
console.setFormatter(formatter)
logging.getLogger('').addHandler(console)
#读取testcase excel文件,获取测试数据,调用interfaceTest方法,将结果保存至errorCase列表中。
import xlrd,hashlib,json
def runTest(testCaseFile):
testCaseFile = os.path.join(os.getcwd(),testCaseFile)
if not os.path.exists(testCaseFile):
logging.error('测试用例文件不存在!')
sys.exit()
testCase = xlrd.open_workbook(testCaseFile)
table = testCase.sheet_by_index(0)
errorCase = [] #用于保存接口返回的内容和HTTP状态码
s = None
for i in range(1,table.nrows):
if table.cell(i, 9).vale.replace('\n','').replace('\r','') != 'Yes':
continue
num = str(int(table.cell(i, 0).value)).replace('\n','').replace('\r','')
api_purpose = table.cell(i, 1).value.replace('\n','').replace('\r','')
api_host = table.cell(i, 2).value.replace('\n','').replace('\r','')
request_method = table.cell(i, 4).value.replace('\n','').replace('\r','')
request_data_type = table.cell(i, 5).value.replace('\n','').replace('\r','')
request_data = table.cell(i, 6).value.replace('\n','').replace('\r','')
encryption = table.cell(i, 7).value.replace('\n','').replace('\r','')
check_point = table.cell(i, 8).value
if encryption == 'MD5': #如果数据采用md5加密,便先将数据加密
request_data = json.loads(request_data)
request_data['pwd'] = md5Encode(request_data['pwd'])
status, resp, s = interfaceTest(num, api_purpose, api_host, request_url, request_data, check_point, request_methon, request_data_type, s)
if status != 200 or check_point not in resp: #如果状态码不为200或者返回值中没有检查点的内容,那么证明接口产生错误,保存错误信息。
errorCase.append((num + ' ' + api_purpose, str(status), 'http://'+api_host+request_url, resp))
return errorCase
#接受runTest的传参,利用requests构造HTTP请求
import requests
def interfaceTest(num, api_purpose, api_host, request_method,
request_data_type, request_data, check_point, s=None)
headers = {'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8',
'X-Requested-With' : 'XMLHttpRequest',
'Connection' : 'keep-alive',
'Referer' : 'http://' + api_host,
'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36'
}
if s == None:
s = requests.session()
if request_method == 'POST':
if request_url != '/login' :
r = s.post(url='http://'+api_host+request_url, data = json.loads(request_data), headers = headers) #由于此处数据没有经过加密,所以需要把Json格式字符串解码转换成**Python对象**
elif request_url == '/login' :
s = requests.session()
r = s.post(url='http://'+api_host+request_url, data = request_data, headers = headers) #由于登录密码不能明文传输,采用MD5加密,在之前的代码中已经进行过json.loads()转换,所以此处不需要解码
else:
logging.error(num + ' ' + api_purpose + ' HTTP请求方法错误,请确认[Request Method]字段是否正确!!!')
s = None
return 400, resp, s
status = r.status_code
resp = r.text
print resp
if status == 200 :
if re.search(check_point, str(r.text)):
logging.info(num + ' ' + api_purpose + ' 成功,' + str(status) + ', ' + str(r.text))
return status, resp, s
else:
logging.error(num + ' ' + api_purpose + ' 失败!!!,[' + str(status) + '], ' + str(r.text))
return 200, resp , None
else:
logging.error(num + ' ' + api_purpose + ' 失败!!!,[' + str(status) + '],' + str(r.text))
return status, resp.decode('utf-8'), None
import hashlib
def md5Encode(data):
hashobj = hashlib.md5()
hashobj.update(data.encode('utf-8'))
return hashobj.hexdigest()
def sendMail(text):
mail_info = get_conf()
sender = mail_info['sender']
receiver = mail_info['receiver']
subject = '[AutomationTest]接口自动化测试报告通知'
smtpserver = mail_info['smtpserver']
username = mail_info['username']
password = mail_info['password']
msg = MIMEText(text,'html','utf-8')
msg['Subject'] = subject
msg['From'] = sender
msg['To'] = ''.join(receiver)
smtp = smtplib.SMTP()
smtp.connect(smtpserver)
smtp.login(username, password)
smtp.sendmail(sender, receiver, msg.as_string())
smtp.quit()
def main():
errorTest = runTest('TestCase/TestCase.xlsx')
if len(errorTest) > 0:
html = '接口自动化定期扫描,共有 ' + str(len(errorTest)) + ' 个异常接口,列表如下:' + '接口 状态 接口地址 接口返回值 '
for test in errorTest:
html = html + '' + test[0] + ' ' + test[1] + ' ' + test[2] + ' ' + test[3] + ' '
sendMail(html)
if __name__ == '__main__':
main()
由于所有的操作必须在系统登录之后进行,一开始没有注意到cookie这一点,每读取一个测试用例,都会新建一个session,导致无法维护上一次请求的cookie。然后将cookie添加入请求头中,但是第二个用例仍然无法执行成功。后来用fiddler抓包分析了一下,发现cookie的值竟然是每一次操作后都会变化的!!!
所以只能通过session自动维护cookie。 在interfaceTest函数中,返回三个值,分别是HTTP CODE,HTTP返回值与session。再将上一次请求的session作为入参传入interfaceTest函数中,在函数内部判断session是否存在,如果不为None,那么直接利用传入的session执行下一个用例,如果为None,那么新建一个session。
不足之处
框架十分简陋,只是简单想法的实现,对于编码的细节没有完善。
HTML的测试报告书写起来比较麻烦,可以考虑引入第三方库进行HTML测试报告的书写,将生成的HTML文件作为附件发送。
只是针对公司内部的软件,换用其他平台就不适用,需要修改源码。
你可能感兴趣的:(基于python的接口自动化测试框架)
有什么工作适合学生?做暑假工要注意什么?
氧惠导师
对于大学生来说,在暑假的时候其实可以做一些暑假工,这样子不但可以贴补家用,还能够丰富自己的人生阅历,是两全其美的事情。那么有什么暑假工适合学生呢?下面进行解答。➤推荐网购薅羊毛app“氧惠”,一个领隐藏优惠券+现金返利的平台。氧惠只提供领券返利链接,下单全程都在淘宝、京东、拼多多等原平台,更支持抖音、快手电商、外卖红包返利等。(应用市场搜“氧惠”下载,邀请码:521521,全网优惠上氧惠!)➤由于
枫叶的成长计划
小婷说
2019/12.23【行】毕:图分类,和鹰说清楚昨天的事,遥感复习到五十页,和白杨聊了聊昨天发生的事,买苹果未毕:c++未写,电影还没看1.找到给桌子的那个人2.早上七点起床做好标语准备买苹果啦3.遥感图分类问问黎霞小姐妹4.遥感背书二十五页5.做五道数学题嘻嘻嘻(˙︶˙)6.隔一小时发布买苹果消息7.中午和静雯吃饭(✪✪)晚上喝葵葵一起聊聊【见】今天是冬至好热闹,一大早群里的消息就把我惊醒,满屏
RabbitMQ 手册 - "Hello World"
乡间IT学者
英文原文链接介绍准备本手册假定RabbitMQ已经安装并且运行在本机,监听了标准的5672端口。如果你使用了不同的主机,端口或者凭证,连接设置也需要相应地调整。从哪里获取帮助如果你在阅读本手册有任何困惑,可以通过邮件列表联系我们RabbitMQ是一个消息代理:它接受并转发消息。你可以认为他是一个邮局:当你在邮箱放了一封你想邮送的信件,你可以确定某个邮递员最终会将邮件送达给收件人。在这个类比中,Ra
《发展心理学》第十章儿童中期的社会性和人格发展读书笔记二:关系:儿童中期关系的建立(草稿)
温暖如春艳阳天
友谊的阶段:友谊观点的变化阶段1:基于他人行为的友谊。这一阶段大概从四岁到七岁,此时儿童会把那些和自己相似的人当做朋友(分享玩具、一起玩其他活动的伙伴)。儿童常常将那些和自己在一起玩得最多的同伴视为朋友。他们根据他人的行为来决定谁是朋友,喜欢那些可以相互分享的人。阶段2:基于信任的友谊。这一阶段大概从八岁到十岁。这时候的儿童会考虑他人的个人特点,特质以及他人可以提供的奖赏。这一阶段友谊的核心是相互
关于时间的思考
逆向学习
image.png最近一直在忙着找工作,可以说算是很焦虑很忙了,然而周末的时候我却花了接近两天的时间躺着看电视,只在第一天的时候拿起书本看了看。在决定是否要做一件事情时,没时间常常是我们第一个冒出来的念头。比如这段时间,我因为这个理由推了好几次同学的邀约,也因为这个理由没有继续去修改自己的毕业论文。一想到还要找工作,要学习旧知识并复习新知识,就觉得自己似乎真的很忙很忙。然而周末的两天时间却瞬间让我
篯铿
近水远山GSAG
☞〖篯铿〗篯铿,是彭姓、韦姓等族人共同的祖先,今人曰之“彭祖”,即大彭氏国始祖,因受封于彭城建立大彭氏国而被后人尊称为彭祖。庄子《逍遥游》有云:“上占有大椿者,以八千岁为春,八千岁为秋。而彭祖乃今以久特闻,众人匹之。不亦悲乎!”,庄子所说的彭祖即篯铿。篯铿是颛顼的玄孙(黄帝的第八代孙)。篯铿这个氏族是上古时代一个有代表性的著名长寿家族。☞篯铿简介本名:篯铿别称:彭祖、东海君、彭城伯出生时间:公元前
白杨树、椿树和柳树的传说
泰山寒梅
白杨树遇到风吹,就啪啪作响,像是起了阵阵的掌声。因此,当地的人们给白杨树起了个既形象又阴森可怖的绰号叫"鬼拍手"。椿树上的椿菱黄澄澄的好看,椿树也以此引以为傲。柳树长袖善舞,腹部却存留着难堪的旧痕伤疤,这到底是怎么回事?从前,森林界举行了一次声势浩大的小姐选美大赛。柳小姐不仅长得长发披肩,亭亭玉立,而且还能歌善舞,理所当然地评选上了这次选美冠军,椿小姐的长相和才艺跟柳小姐相比起来,那简直是相差十万
6月5日记录
接纳放下化掉
今天是今年第一次请家人们吃饭,家人为我做的太多,我回报的却那么少,以后我要多为我们的家付出,只要大家齐心协力,我坚信我们家族会越来越繁荣昌盛!今日成功日记1.今天完成了第二次私董会幕僚官的体验,听别人的故事,悟自己的人生!生命在于体验!今日感恩日记感恩自己,放松状态,享受当下的生活,一切皆美好!感恩家人,你们总是我无条件的支持者,也是我前行的动力,我爱你们!感恩变现学院的家人们,每天浸泡在里面,让
GB28181应急救援行业视音频解决方案探究和技术实现
音视频牛哥
GB28181接入 SmartGBD 实时音视频 GB28181客户端 GB28181应急救援 GB28181设备 GB28181平台 GB28181安卓端 大牛直播SDK
技术背景应急救援是一项针对突发、具有破坏力的紧急事件采取预防、预备、响应和恢复的活动与计划。这些紧急事件可能包括自然灾害(如地震、洪水、台风)、事故灾难(如火灾、爆炸、交通事故)、公共卫生事件(如疫情、食物中毒)等。应急救援工作的有效实施对于保障公众的生命安全、减轻灾害损失、维护社会稳定具有重要意义。GB28181应急救援技术优势GB28181在应急救援行业的应用解决方案主要体现了其在视频监控、数
适合懒人开的店、手里有3万做点什么小生意好?
好项目高省
当下的时代很多人走上了自主创业的道路,有的人通过自己的努力让家人过上了好的生活,做一些小的投资项目。其实只要投对了项目,那么赚钱就不是问题。可能很多的项目需要投资大量的资金和人力物力,但是市场上也存在一些小项目。那你知道有哪些小项目很受欢迎呢?可以简单来了解一下,看看有没有适合自己的。至于我为何用高省APP领取优惠券呢,当然是高省APP佣金更高,模式更好,终端用户不流失。【高省】是一个自用省钱佣金
幸运五叶草
牵着蜗牛去散步121
今天下午陪孩子在小广场玩。偶然发现有一片绿绿的草地,那是一小片三叶草。我蹲下身,用手轻轻地拨开,在里面寻找。在三叶草里寻找四叶草,已经成为我的习惯。上大学时我和好友出去踏青。路过一片绿草地,好友忽地蹲下,又招呼我和她一起。好友告诉我,这是三叶草。我看了看,果然如此,每株小植物都有三片叶子。好友又说:“如果能从里面找到四叶草,那就是幸运草,你就会有好运。”我和好友埋头寻找四叶草。从一大片颜色、形状相
Focus Corona第4天作业#何一味Corona渲染课
Focus_8490
本课做皮革和地毯皮革,漫反射加合成贴图,加衰减遮罩,模拟高光的感觉注意,纹理贴图前面要加个颜色校正,以方便改亮度和饱合=============================================================================================================================================
日记里的春天
楚煜楚尧
今年的冬天来得很突然,几天前还是酷热的夏天,冷风一吹,透心凉的冬天就直接跳过秋天,高调出场了。当我批改学生的日记时,温暖的春天又猝不及防地出现在我的眼前。日记里有一个自称精致优雅的女孩,她会在国庆假期里走出家门摘一朵小花别在头上,她会一边尽情吮吸桂花的香气,一边暗暗祈祷:不要下雨,不要刮风,不要吹淡了桂花香。日记里,别的同学总在埋怨她,喜欢拉扯着同学不分时间、地点的嘻嘻哈哈,让小组因为她的不守纪律
从MVC到DDD的架构演进
洛蕾
计算机 mvc 架构
Python微信订餐小程序课程视频https://edu.csdn.net/course/detail/36074Python实战量化交易理财系统https://edu.csdn.net/course/detail/35475DDD这几年越来越火,资料也很多,大部分的资料都偏向于理论介绍,有给出的代码与传统MVC的三层架构差异较大,再加上大量的新概念很容易让初学者望而却步。本文从MVC架构角度来讲
DM8 分布计算集群(DMDPC)Docker 命令行部署指南
69岁法外狂徒
docker 容器 数据库 分布式
简介DMDPC是一款同时支持在线分析处理(OLAP)和在线事务处理(OLTP)的新型分布式数据库系统。它不仅保留了传统单机数据库的大部分功能,还提供了分布式计算集群所特有的高可用性、高扩展性、高性能、高吞吐量以及对用户透明等高级特性。本文借助命令行工具部署DPC集群。系统架构DMDPC的架构由三个核心组件组成:计划生成节点(SP):对外提供分布式数据库服务,负责接收用户请求、生成执行计划,并调度计
Linux从入门到开发实战(C/C++)Day09-poll和epoll
黒井深
c语言 c++ linux
poll:和select差不多#includeintpoll(structpollfd*fds,nfds_tnfds,inttimeout);与select共同点:还是轮询(轮询结构体数组)区别1:监视的不是描述符号集合,是结构体数组structpollfd{intfd;/*filedescriptor*/shortevents;/*requestedevents需要监视的事件*/shortrev
惊蛰
占愚姑娘
惊蛰在古时有三候,一候桃始华,二候仓庚鸣,三候鹰化为鸠,三候所代表的花信分别为桃花,杏花与蔷薇,其实对于惊蛰这一节气我所知甚少,若非刻意去看墙上的日历,我大概是不知道它到底是哪一天的。惊蛰的到来,也就意味着入冬藏伏的蛰虫开始苏醒,天气乍暖,一阵春雨润百卉绽芽,耕种也便开始。春天的脚步总是来的惹人注意,它似乎从未想过掩饰自己降临人间的痕迹,我们喜爱它或许正由于它随处走的每一步脚印,都有生命力的味道,
asp.net core 8.0 使用 Autofac ioc 容器 具体实例
彭小彭~
.net core asp.net
要在ASP.NETCore8.0项目中具体实现使用Autofac作为IOC容器,我们将遵循一个明确的示例,从创建新项目到配置Autofac,并演示如何注册和解析服务。步骤1:创建ASP.NETCore8.0项目首先,使用VisualStudio或命令行工具创建一个新的ASP.NETCoreWeb应用程序。如果使用命令行,可以运行以下命令:dotnetnewwebapp-nAutofacDemocd
欲扬先抑定律——“打”与“送”的顺序决定批评的效果
腾锐妈
2019年7月18日《说话心理学》读书笔记:心理学中有这样一个现象:先贬后褒,先抑后扬,易得人好感。这就是欲扬先抑定律。批评一个人应该讲究方法,可以运用一下欲扬先抑定律,对别人先否定后肯定,先抑后扬,这样你批评的话语别人才更乐意接受。
2021-05-31
优悠优悠
昨晚在汇米巴一个男人买了瓶一块五的矿泉水一盒软包装的椰子汁,顺手把矿泉水递给了一个5、6岁的小女孩,我本来也没在意,这时候一个十一二岁的男孩抱着篮球走了过来,男人把椰汁给了男孩,关切的注视他喝椰汁,眼神一直盯着男孩看都不看旁边的女孩,瞬间就觉得这个男人好猥琐,在现在这个年代,几块钱的事情重男轻女得如此明显,无疑是个乡里X。在我小时候那个年代,父亲每个月工资全部交给母亲,自己只留下一点点零用钱,父亲
谈谈你对多线程开发的理解?ios中有几种实现多线程的方法?
充满活力的早晨
好处:1.使用线程可以把占据时间长的程序中的任务放到后台去处理2.用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度3.程序的运行速度可能加快4·在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。缺点:1.如果有大量的线程,会影响性能,因为操作系统需要在它们之间切换。2.更多的线程需要更多的内存空间。3.线程的中止
2023-02-05
执剑饮烈酒
1、人生本来就没有相欠。别人对你付出,是因为别人欢喜。你对别人付出,是因为自己甘愿。——白落梅2、独利则败,众谋则泄。大柔非柔,至刚无刚。——曾国藩3、中国的孩子,只要生,不管他好不好;只要多,不管他才不才。生他的人,不负教他的责任。这许多人口,便只在尘世中辗转。小的时候不把他当人,大了以后,也做不了人。——鲁迅《热风·1918》4、对于见面我看得较重,对于分别我看得较轻,这是人生取巧之一法,否则
2018-07-27
晰姐吉祥
姓名:王彬公司:杭州爵卓服饰有限公司(NE潮牌男装)【日精进打卡第27天】【知~学习】《六项精进》5遍共121遍《六项精进》通篇0遍共13遍《大学》5遍共80遍《经营十二条》0遍共4遍•••••【经典名句分享】所谓成功,就是在平凡中做出不平凡的坚持。【行~实践】一、修身:(对自己个人)1、边跑步边背诵《大学》《六项精进》;2、早晨完成晨跑4公里;二、齐家:(对家庭和家人)1、辅导儿子功课;2、陪爸
《星汉灿烂·月升沧海》五公主:放养不等于放纵
惟Vivid
在月升沧海新播出的剧集中,处处都是名场面,“月升沧海这两集封神”更是直登热搜榜,在磕男女主双向奔赴爱情的同时,“五公主蠢”这一话题也引发了热议。在新的剧集中,我们看到所有人都一心为皇后过寿,然而皇后的亲生女儿五公主,却想着在寿宴上怎么搞事情,在盘算着怎么陷害程少商。五公主知道程少商在静心湖醒酒,便故意引诱五皇子前往,想要栽赃程少商与五皇子私会,败坏她的名声。五公主在皇后寿宴前几日才把程少商推下水,
那次考试,我睡着了
无他亦无她
那次考试,我睡着了八年级上册期中考试时,那时是冬天,特别的冷,当时正在考语文。当广播宣布考试开始的时候,当时也像平时一样,大家都忙着提笔写字,但是因为太冷了,我都有些麻木了,但是还是提笔开始答题。写了不久,因为天气冷,整个教室全部封闭起来,我用14年作弊经验的方法小心地试探地望向四周,哎呀妈呀大家一个个小脸扑通红通通啊,那感觉,就像南方开了暖气。大家可以想象一下,在寒冷的冬天,你睡在开了暖气的房间
使用sass的混合插入模式进行@media响应式媒体查询做自适应开发
miao_zz
css sass 媒体 前端
使用sass的混合插入模式进行@media响应式媒体查询做自适应开发//定义混合指令并传参数@mixinrespond($breakname){//控制指令@if$breakname=='phone'{//手机端=1201@media(min-width:1201px){//向混合样式中导入内容@content;}}}.mz-col{border:1pxsolid$borderColor;@inc
Day1:市场调查
讲多无谓啊
从今日开始意味着正式下市场,第一天的晨会是规章制度的制定。准备事项的通知以及宿舍长的选拔到安排工作。距离去年市场调查已一年有余,在上海刚开始下市场战战兢兢的模样,已然模糊。今日分到的区域,虽平房一片,荒凉至极。但也算有点收获,这一大片的区域,可以用三个字概括:拆迁户。按照我的理念来讲,拆迁户大多数还是有经济实力的,比起出租户过多的地方,总归还是有有点经济实力的,尽管转悠一下午没看到过多的人流量以及
.Net项目引入ORM SqlSugar框架及简单使用
Herman97
C# SQL SQLSugar ORM
SqlSugar的优点就不在这里重复了。一,Nuget安装SqlSugar是.NET版本,SqlSugarCore是.NETCORE版本,根据你的项目选择你的引用dll二,简单使用1.建立数据库连接publicSqlSugarClientGesmartDb(){SqlSugarClientDb=newSqlSugarClient(newConnectionConfig(){ConnectionSt
vue中给打包的文件指定自定义文件名以及加上哈希值解决每次打包上线存在缓存问题
miao_zz
vue vue
vue中给打包的文件指定自定义文件名以及加上哈希值解决每次打包上线存在缓存问题vue.config.jsvue.config.jsconstport=process.env.port||8081//端口constTimestamp=newDate().getTime();constMiniCssExtractPlugin=require("mini-css-extract-plugin")modu
java的socket实现一个九宫棋游戏
睡不醒的小泽
前言一个简单的socket小作品=v=一个机酱在大三实验课中接触到很基础的JAVA语言socket编程。至于你问为什么嵌入式的机酱会弄些Java吗?emmmmm,可能是当初C语言版的不够好玩吧,另外如果碰巧有用,欢迎抱走的yoo在之前的笔记《网络基础知识和网络编程》中有讲解过关于网络编程的一些基本知识,以及一些LinuxC的socket编程,希望粗浅了解socket内部肌理的同学,右转咱的学习笔记
apache ftpserver-CentOS config
gengzg
apache
<server xmlns="http://mina.apache.org/ftpserver/spring/v1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://mina.apache.o
优化MySQL数据库性能的八种方法
AILIKES
sql mysql
1、选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快。因此,在创建表的时候,为了获得更好的 性能,我们可以将表中字段的宽度设得尽可能小。例如,在定义邮政编码这个字段时,如果将其设置为CHAR(255),显然给数据库增加了不必要的空间,甚至使用VARCHAR这种类型也是多余的,因为CHAR(6)就可以很
JeeSite 企业信息化快速开发平台
Kai_Ge
JeeSite
JeeSite 企业信息化快速开发平台
平台简介
JeeSite是基于多个优秀的开源项目,高度整合封装而成的高效,高性能,强安全性的开源Java EE快速开发平台。
JeeSite本身是以Spring Framework为核心容器,Spring MVC为模型视图控制器,MyBatis为数据访问层, Apache Shiro为权限授权层,Ehcahe对常用数据进行缓存,Activit为工作流
通过Spring Mail Api发送邮件
120153216
邮件 main
原文地址:http://www.open-open.com/lib/view/open1346857871615.html
使用Java Mail API来发送邮件也很容易实现,但是最近公司一个同事封装的邮件API实在让我无法接受,于是便打算改用Spring Mail API来发送邮件,顺便记录下这篇文章。 【Spring Mail API】
Spring Mail API都在org.spri
Pysvn 程序员使用指南
2002wmj
SVN
源文件:http://ju.outofmemory.cn/entry/35762
这是一篇关于pysvn模块的指南.
完整和详细的API请参考 http://pysvn.tigris.org/docs/pysvn_prog_ref.html.
pysvn是操作Subversion版本控制的Python接口模块. 这个API接口可以管理一个工作副本, 查询档案库, 和同步两个.
该
在SQLSERVER中查找被阻塞和正在被阻塞的SQL
357029540
SQL Server
SELECT R.session_id AS BlockedSessionID ,
S.session_id AS BlockingSessionID ,
Q1.text AS Block
Intent 常用的用法备忘
7454103
.net android Google Blog F#
Intent
应该算是Android中特有的东西。你可以在Intent中指定程序 要执行的动作(比如:view,edit,dial),以及程序执行到该动作时所需要的资料 。都指定好后,只要调用startActivity(),Android系统 会自动寻找最符合你指定要求的应用 程序,并执行该程序。
下面列出几种Intent 的用法
显示网页:
Spring定时器时间配置
adminjun
spring 时间配置 定时器
红圈中的值由6个数字组成,中间用空格分隔。第一个数字表示定时任务执行时间的秒,第二个数字表示分钟,第三个数字表示小时,后面三个数字表示日,月,年,< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" />
测试的时候,由于是每天定时执行,所以后面三个数
POJ 2421 Constructing Roads 最小生成树
aijuans
最小生成树
来源:http://poj.org/problem?id=2421
题意:还是给你n个点,然后求最小生成树。特殊之处在于有一些点之间已经连上了边。
思路:对于已经有边的点,特殊标记一下,加边的时候把这些边的权值赋值为0即可。这样就可以既保证这些边一定存在,又保证了所求的结果正确。
代码:
#include <iostream>
#include <cstdio>
重构笔记——提取方法(Extract Method)
ayaoxinchao
java 重构 提炼函数 局部变量 提取方法
提取方法(Extract Method)是最常用的重构手法之一。当看到一个方法过长或者方法很难让人理解其意图的时候,这时候就可以用提取方法这种重构手法。
下面是我学习这个重构手法的笔记:
提取方法看起来好像仅仅是将被提取方法中的一段代码,放到目标方法中。其实,当方法足够复杂的时候,提取方法也会变得复杂。当然,如果提取方法这种重构手法无法进行时,就可能需要选择其他
为UILabel添加点击事件
bewithme
UILabel
默认情况下UILabel是不支持点击事件的,网上查了查居然没有一个是完整的答案,现在我提供一个完整的代码。
UILabel *l = [[UILabel alloc] initWithFrame:CGRectMake(60, 0, listV.frame.size.width - 60, listV.frame.size.height)]
NoSQL数据库之Redis数据库管理(PHP-REDIS实例)
bijian1013
redis 数据库 NoSQL
一.redis.php
<?php
//实例化
$redis = new Redis();
//连接服务器
$redis->connect("localhost");
//授权
$redis->auth("lamplijie");
//相关操
SecureCRT使用备注
bingyingao
secureCRT 每页 行数
SecureCRT日志和卷屏行数设置
一、使用securecrt时,设置自动日志记录功能。
1、在C:\Program Files\SecureCRT\下新建一个文件夹(也就是你的CRT可执行文件的路径),命名为Logs;
2、点击Options -> Global Options -> Default Session -> Edite Default Sett
【Scala九】Scala核心三:泛型
bit1129
scala
泛型类
package spark.examples.scala.generics
class GenericClass[K, V](val k: K, val v: V) {
def print() {
println(k + "," + v)
}
}
object GenericClass {
def main(args: Arr
素数与音乐
bookjovi
素数 数学 haskell
由于一直在看haskell,不可避免的接触到了很多数学知识,其中数论最多,如素数,斐波那契数列等,很多在学生时代无法理解的数学现在似乎也能领悟到那么一点。
闲暇之余,从图书馆找了<<The music of primes>>和<<世界数学通史>>读了几遍。其中素数的音乐这本书与软件界熟知的&l
Java-Collections Framework学习与总结-IdentityHashMap
BrokenDreams
Collections
这篇总结一下java.util.IdentityHashMap。从类名上可以猜到,这个类本质应该还是一个散列表,只是前面有Identity修饰,是一种特殊的HashMap。
简单的说,IdentityHashMap和HashM
读《研磨设计模式》-代码笔记-享元模式-Flyweight
bylijinnan
java 设计模式
声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java
PS人像润饰&调色教程集锦
cherishLC
PS
1、仿制图章沿轮廓润饰——柔化图像,凸显轮廓
http://www.howzhi.com/course/retouching/
新建一个透明图层,使用仿制图章不断Alt+鼠标左键选点,设置透明度为21%,大小为修饰区域的1/3左右(比如胳膊宽度的1/3),再沿纹理方向(比如胳膊方向)进行修饰。
所有修饰完成后,对该润饰图层添加噪声,噪声大小应该和
更新多个字段的UPDATE语句
crabdave
update
更新多个字段的UPDATE语句
update tableA a
set (a.v1, a.v2, a.v3, a.v4) = --使用括号确定更新的字段范围
hive实例讲解实现in和not in子句
daizj
hive not in in
本文转自:http://www.cnblogs.com/ggjucheng/archive/2013/01/03/2842855.html
当前hive不支持 in或not in 中包含查询子句的语法,所以只能通过left join实现。
假设有一个登陆表login(当天登陆记录,只有一个uid),和一个用户注册表regusers(当天注册用户,字段只有一个uid),这两个表都包含
一道24点的10+种非人类解法(2,3,10,10)
dsjt
算法
这是人类算24点的方法?!!!
事件缘由:今天晚上突然看到一条24点状态,当时惊为天人,这NM叫人啊?以下是那条状态
朱明西 : 24点,算2 3 10 10,我LX炮狗等面对四张牌痛不欲生,结果跑跑同学扫了一眼说,算出来了,2的10次方减10的3次方。。我草这是人类的算24点啊。。
然后么。。。我就在深夜很得瑟的问室友求室友算
刚出完题,文哥的暴走之旅开始了
5秒后
关于YII的菜单插件 CMenu和面包末breadcrumbs路径管理插件的一些使用问题
dcj3sjt126com
yii framework
在使用 YIi的路径管理工具时,发现了一个问题。 <?php  
对象与关系之间的矛盾:“阻抗失配”效应[转]
come_for_dream
对象
概述
“阻抗失配”这一词组通常用来描述面向对象应用向传统的关系数据库(RDBMS)存放数据时所遇到的数据表述不一致问题。C++程序员已经被这个问题困扰了好多年,而现在的Java程序员和其它面向对象开发人员也对这个问题深感头痛。
“阻抗失配”产生的原因是因为对象模型与关系模型之间缺乏固有的亲合力。“阻抗失配”所带来的问题包括:类的层次关系必须绑定为关系模式(将对象
学习编程那点事
gcq511120594
编程 互联网
一年前的夏天,我还在纠结要不要改行,要不要去学php?能学到真本事吗?改行能成功吗?太多的问题,我终于不顾一切,下定决心,辞去了工作,来到传说中的帝都。老师给的乘车方式还算有效,很顺利的就到了学校,赶巧了,正好学校搬到了新校区。先安顿了下来,过了个轻松的周末,第一次到帝都,逛逛吧!
接下来的周一,是我噩梦的开始,学习内容对我这个零基础的人来说,除了勉强完成老师布置的作业外,我已经没有时间和精力去
Reverse Linked List II
hcx2013
list
Reverse a linked list from position m to n. Do it in-place and in one-pass.
For example:Given 1->2->3->4->5->NULL, m = 2 and n = 4,
return 
Spring4.1新特性——页面自动化测试框架Spring MVC Test HtmlUnit简介
jinnianshilongnian
spring 4.1
目录
Spring4.1新特性——综述
Spring4.1新特性——Spring核心部分及其他
Spring4.1新特性——Spring缓存框架增强
Spring4.1新特性——异步调用和事件机制的异常处理
Spring4.1新特性——数据库集成测试脚本初始化
Spring4.1新特性——Spring MVC增强
Spring4.1新特性——页面自动化测试框架Spring MVC T
Hadoop集群工具distcp
liyonghui160com
1. 环境描述
两个集群:rock 和 stone
rock无kerberos权限认证,stone有要求认证。
1. 从rock复制到stone,采用hdfs
Hadoop distcp -i hdfs://rock-nn:8020/user/cxz/input hdfs://stone-nn:8020/user/cxz/运行在rock端,即源端问题:报版本
一个备份MySQL数据库的简单Shell脚本
pda158
mysql 脚本
主脚本(用于备份mysql数据库): 该Shell脚本可以自动备份
数据库。只要复制粘贴本脚本到文本编辑器中,输入数据库用户名、密码以及数据库名即可。我备份数据库使用的是mysqlump 命令。后面会对每行脚本命令进行说明。
1. 分别建立目录“backup”和“oldbackup” #mkdir /backup #mkdir /oldbackup
300个涵盖IT各方面的免费资源(中)——设计与编码篇
shoothao
IT资源 图标库 图片库 色彩板 字体
A. 免费的设计资源
Freebbble:来自于Dribbble的免费的高质量作品。
Dribbble:Dribbble上“免费”的搜索结果——这是巨大的宝藏。
Graphic Burger:每个像素点都做得很细的绝佳的设计资源。
Pixel Buddha:免费和优质资源的专业社区。
Premium Pixels:为那些有创意的人提供免费的素材。
thrift总结 - 跨语言服务开发
uule
thrift
官网
官网JAVA例子
thrift入门介绍
IBM-Apache Thrift - 可伸缩的跨语言服务开发框架
Thrift入门及Java实例演示
thrift的使用介绍
RPC
POM:
<dependency>
<groupId>org.apache.thrift</groupId>