说明:这里笔者使用 gobot框架
成都创新互联公司是一家集网站建设,金堂县企业网站建设,金堂县品牌网站建设,网站定制,金堂县网站建设报价,网络营销,网络优化,金堂县网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
官网:
执行下面命令:
命令执行完成后,会生成一个main的二进制文件,那个就是我们的程序
备注:如果你想编译其他版本的树莓程序?修改 GOARM 即可
GOARM=6 (Raspberry Pi A, A+, B, B+, Zero) GOARM=7 (Raspberry Pi 2, 3)
备注:总结后面有上传脚本 ^ _ ^
1.请确保你已经连接到树莓派了
2.如果无法上传,或者报错,请查权限是否正确
执行上传命令:
scp main pi@192.168.1.xxx :/home/pi/
1.请确保你已经连接到树莓派了
进入 /home/pi (就是你刚上传的文件路径)
运行它: ./main
祝你好运!
1.上传文件的时候,请注意命令
2.不知道如何ssh登陆树莓派?(请看我上一篇文章)
3.当然需要一点linux的知识
本教程介绍了使用 Godatabase/sql及其标准库中的包访问关系数据库的基础知识。
您将使用的database/sql包包括用于连接数据库、执行事务、取消正在进行的操作等的类型和函数。
在本教程中,您将创建一个数据库,然后编写代码来访问该数据库。您的示例项目将是有关老式爵士乐唱片的数据存储库。
首先,为您要编写的代码创建一个文件夹。
1、打开命令提示符并切换到您的主目录。
在 Linux 或 Mac 上:
在 Windows 上:
2、在命令提示符下,为您的代码创建一个名为 data-access 的目录。
3、创建一个模块,您可以在其中管理将在本教程中添加的依赖项。
运行go mod init命令,为其提供新代码的模块路径。
此命令创建一个 go.mod 文件,您添加的依赖项将在其中列出以供跟踪。
注意: 在实际开发中,您会指定一个更符合您自己需求的模块路径。有关更多信息,请参阅一下文章。
GO语言(二十五):管理依赖项(上)
GO语言(二十六):管理依赖项(中)
GO语言(二十七):管理依赖项(下)
接下来,您将创建一个数据库。
在此步骤中,您将创建要使用的数据库。您将使用 DBMS 本身的 CLI 创建数据库和表,以及添加数据。
您将创建一个数据库,其中包含有关黑胶唱片上的老式爵士乐录音的数据。
这里的代码使用MySQL CLI,但大多数 DBMS 都有自己的 CLI,具有类似的功能。
1、打开一个新的命令提示符。
在命令行,登录到您的 DBMS,如下面的 MySQL 示例所示。
2、在mysql命令提示符下,创建一个数据库。
3、切到您刚刚创建的数据库,以便您可以添加表。
4、在文本编辑器的 data-access 文件夹中,创建一个名为 create-tables.sql 的文件来保存用于添加表的 SQL 脚本。
将以下 SQL 代码粘贴到文件中,然后保存文件。
在此 SQL 代码中:
(1)删除名为album表。 首先执行此命令可以让您更轻松地稍后重新运行脚本。
(2)创建一个album包含四列的表:title、artist和price。每行的id值由 DBMS 自动创建。
(3)添加带有值的四行。
5、在mysql命令提示符下,运行您刚刚创建的脚本。
您将使用以下形式的source命令:
6、在 DBMS 命令提示符处,使用SELECT语句来验证您是否已成功创建包含数据的表。
接下来,您将编写一些 Go 代码进行连接,以便进行查询。
现在你已经有了一个包含一些数据的数据库,开始你的 Go 代码。
找到并导入一个数据库驱动程序,该驱动程序会将您通过database/sql包中的函数发出的请求转换为数据库可以理解的请求。
1、在您的浏览器中,访问SQLDrivers wiki 页面以识别您可以使用的驱动程序。
2、使用页面上的列表来识别您将使用的驱动程序。为了在本教程中访问 MySQL,您将使用 Go-MySQL-Driver。
3、请注意驱动程序的包名称 - 此处为github.com/go-sql-driver/mysql.
4、使用您的文本编辑器,创建一个用于编写 Go 代码的文件,并将该文件作为 main.go 保存在您之前创建的数据访问目录中。
5、进入main.go,粘贴以下代码导入驱动包。
在此代码中:
(1)将您的代码添加到main包中,以便您可以独立执行它。
(2)导入 MySQL 驱动程序github.com/go-sql-driver/mysql。
导入驱动程序后,您将开始编写代码以访问数据库。
现在编写一些 Go 代码,让您使用数据库句柄访问数据库。
您将使用指向结构的指针sql.DB,它表示对特定数据库的访问。
编写代码
1、进入 main.go,在import您刚刚添加的代码下方,粘贴以下 Go 代码以创建数据库句柄。
在此代码中:
(3)使用 MySQL 驱动程序Config和FormatDSN类型以收集连接属性并将它们格式化为连接字符串的 DSN。
该Config结构使代码比连接字符串更容易阅读。
(4)调用sql.Open 初始化db变量,传递 FormatDSN。
(5)检查来自 的错误sql.Open。例如,如果您的数据库连接细节格式不正确,它可能会失败。
为了简化代码,您调用log.Fatal结束执行并将错误打印到控制台。在生产代码中,您会希望以更优雅的方式处理错误。
(6)调用DB.Ping以确认连接到数据库有效。在运行时, sql.Open可能不会立即连接,具体取决于驱动程序。您在Ping此处使用以确认 database/sql包可以在需要时连接。
(7)检查来自Ping的错误,以防连接失败。
(8)Ping如果连接成功,则打印一条消息。
文件的顶部现在应该如下所示:
3、保存 main.go。
1、开始跟踪 MySQL 驱动程序模块作为依赖项。
使用go get 添加 github.com/go-sql-driver/mysql 模块作为您自己模块的依赖项。使用点参数表示“获取当前目录中代码的依赖项”。
2、在命令提示符下,设置Go 程序使用的DBUSER和DBPASS环境变量。
在 Linux 或 Mac 上:
在 Windows 上:
3、在包含 main.go 的目录中的命令行中,通过键入go run来运行代码。
连接成功了!
接下来,您将查询一些数据。
很多朋友可能知道Go语言的优势在哪,却不知道Go语言适合用于哪些地方。
1、 Go语言作为服务器编程语言,很适合处理日志、数据打包、虚拟机处理、文件系统、分布式系统、数据库代理等;网络编程方面。Go语言广泛应用于Web应用、API应用、下载应用等;除此之外,Go语言还可用于内存数据库和云平台领域,目前国外很多云平台都是采用Go开发。
2、 其实Go语言主要用作服务器端开发。其定位是用来开发"大型软件"的,适合于很多程序员一起开发大型软件,并且开发周期长,支持云计算的网络服务。Go语言能够让程序员快速开发,并且在软件不断的增长过程中,它能让程序员更容易地进行维护和修改。它融合了传统编译型语言的高效性和脚本语言的易用性和富于表达性。
3、 Go语言成功案例。Nsq:Nsq是由Go语言开发的高性能、高可用消息队列系统,性能非常高,每天能处理数十亿条的消息;
4、 Docker:基于lxc的一个虚拟打包工具,能够实现PAAS平台的组建。
5、 Packer:用来生成不同平台的镜像文件,例如VM、vbox、AWS等,作者是vagrant的作者
6、 Skynet:分布式调度框架。
7、 Doozer:分布式同步工具,类似ZooKeeper。
8、 Heka:mazila开源的日志处理系统。
9、 Cbfs:couchbase开源的分布式文件系统。
10、 Tsuru:开源的PAAS平台,和SAE实现的功能一模一样。
11、 Groupcache:memcahe作者写的用于Google下载系统的缓存系统。
12、 God:类似redis的缓存系统,但是支持分布式和扩展性。
13、 Gor:网络流量抓包和重放工具。
以上的就是关于go语言能做什么的内容介绍了。
本教程介绍了 Go 中模糊测试的基础知识。通过模糊测试,随机数据会针对您的测试运行,以尝试找出漏洞或导致崩溃的输入。可以通过模糊测试发现的一些漏洞示例包括 SQL 注入、缓冲区溢出、拒绝服务和跨站点脚本攻击。
在本教程中,您将为一个简单的函数编写一个模糊测试,运行 go 命令,并调试和修复代码中的问题。
首先,为您要编写的代码创建一个文件夹。
1、打开命令提示符并切换到您的主目录。
在 Linux 或 Mac 上:
在 Windows 上:
2、在命令提示符下,为您的代码创建一个名为 fuzz 的目录。
3、创建一个模块来保存您的代码。
运行go mod init命令,为其提供新代码的模块路径。
接下来,您将添加一些简单的代码来反转字符串,稍后我们将对其进行模糊测试。
在此步骤中,您将添加一个函数来反转字符串。
a.使用您的文本编辑器,在 fuzz 目录中创建一个名为 main.go 的文件。
独立程序(与库相反)始终位于 package 中main。
此函数将接受string,使用byte进行循环 ,并在最后返回反转的字符串。
此函数将运行一些Reverse操作,然后将输出打印到命令行。这有助于查看运行中的代码,并可能有助于调试。
e.该main函数使用 fmt 包,因此您需要导入它。
第一行代码应如下所示:
从包含 main.go 的目录中的命令行,运行代码。
可以看到原来的字符串,反转它的结果,然后再反转它的结果,就相当于原来的了。
现在代码正在运行,是时候测试它了。
在这一步中,您将为Reverse函数编写一个基本的单元测试。
a.使用您的文本编辑器,在 fuzz 目录中创建一个名为 reverse_test.go 的文件。
b.将以下代码粘贴到 reverse_test.go 中。
这个简单的测试将断言列出的输入字符串将被正确反转。
使用运行单元测试go test
接下来,您将单元测试更改为模糊测试。
单元测试有局限性,即每个输入都必须由开发人员添加到测试中。模糊测试的一个好处是它可以为您的代码提供输入,并且可以识别您提出的测试用例没有达到的边缘用例。
在本节中,您将单元测试转换为模糊测试,这样您就可以用更少的工作生成更多的输入!
请注意,您可以将单元测试、基准测试和模糊测试保存在同一个 *_test.go 文件中,但对于本示例,您将单元测试转换为模糊测试。
在您的文本编辑器中,将 reverse_test.go 中的单元测试替换为以下模糊测试。
Fuzzing 也有一些限制。在您的单元测试中,您可以预测Reverse函数的预期输出,并验证实际输出是否满足这些预期。
例如,在测试用例Reverse("Hello, world")中,单元测试将返回指定为"dlrow ,olleH".
模糊测试时,您无法预测预期输出,因为您无法控制输入。
但是,Reverse您可以在模糊测试中验证函数的一些属性。在这个模糊测试中检查的两个属性是:
(1)将字符串反转两次保留原始值
(2)反转的字符串将其状态保留为有效的 UTF-8。
注意单元测试和模糊测试之间的语法差异:
(3)确保新包unicode/utf8已导入。
随着单元测试转换为模糊测试,是时候再次运行测试了。
a.在不进行模糊测试的情况下运行模糊测试,以确保种子输入通过。
如果您在该文件中有其他测试,您也可以运行go test -run=FuzzReverse,并且您只想运行模糊测试。
b.运行FuzzReverse模糊测试,查看是否有任何随机生成的字符串输入会导致失败。这是使用go test新标志-fuzz执行的。
模糊测试时发生故障,导致问题的输入被写入将在下次运行的种子语料库文件中go test,即使没有-fuzz标志也是如此。要查看导致失败的输入,请在文本编辑器中打开写入 testdata/fuzz/FuzzReverse 目录的语料库文件。您的种子语料库文件可能包含不同的字符串,但格式相同。
语料库文件的第一行表示编码版本。以下每一行代表构成语料库条目的每种类型的值。由于 fuzz target 只需要 1 个输入,因此版本之后只有 1 个值。
c.运行没有-fuzz标志的go test; 新的失败种子语料库条目将被使用:
由于我们的测试失败,是时候调试了。
go可以在安卓运行的,github.com/golang/mobile,这是用golang做移动端开发的库,
go是静态编译语言,不是脚本语言
一. 什么是LoadRunner LoadRunner是一种预测系统行为和性能的工业标准级负载测试工具。通过以模拟多个用户实施并发负载测试及实时性能检测的方式来确认和查找问题,能对整个企业架构进行测试。 二. LoadRunner的优点 1. 轻松创建虚拟用户:通过记录下业务流程转为测试脚本,在机器上产生多个用户访问,减少负载测试需要的硬件和人力资源。 2. 创建真实的负载:可以通过Controller设定负载方案,如定义用户在什么时候访问系统以产生负载,所有用户同时执行一个动作来模拟峰值负载情况等。 3. 实时监测器:可以实时显示交易性能数据(如响应时间)和其他系统组件如数据库,网络等的实时性能。 4. 分析结果以精确定位问题所在:LoadRunner能收集汇总所有测试数据,提供高级的分析和报告工具。 三. LoadRunner的安装与使用 1.安装过程详见上传的LoadRunner使用手册,在此不再详细介绍。 2.具体使用: 点击File新建录制文件,也可以点击下面的NEW快捷键进行新建。使用File新建,会弹出协议选择窗口,选择新的单协议脚本(New SingleProtocol Script)的Web(HTTP/HTML)项,确定即可(选择Web项是因为我们测试的是Web应用)。接着会弹出开始录制的设置项,需要写入录入系统的地址,点击确定后就会根据录入地址展现系统页面,开始录制脚本,出现小工具条: 第一个按钮为录制键 第二个为回放脚本键 第三个为停止录制键 第四个为暂停录制键 第五个为编译脚本键 第六个为创建新的Action键。LR的录制脚本分为三个部分,vuser_init、vuser_end和 Action。脚本循环执行时,只执行一次vuser_init和vuser_end,而多次循环Action部分。比如录制投保业务时,登陆系统部分放入vuser_init,退出登陆放到vuser_end,中间的投保操作放到Action中,则循环执行时就会登陆一次投保系统开始反复执行投保操作直到结束退出系统。 第七个为用来改变录制的options设置按钮 第八个和第九个为插入事务的起始点和结束点键,结合起来构成一个完整事物,用来衡量服务器的性能。比如录制脚本过程中,投保系统的查询投保单号操作,可以在输入完查询信息后点击查询按钮前插入事务的起始点,查询出数据后插入事务的结束点,这样在运行测试脚本时,Loadrunner在运行到该事务时,便会计算出这个查询操作所花时间,便于衡量服务器执行查询操作的性能。 第十个为插入集合点键,可用于衡量在加重负载的情况下服务器的性能。比如要验证系统是否能承受100人同时进行报案操作,便可在脚本录入过程中,点击报案确认键操作前插入集合点,这样当脚本运行到集合点时,Loadrunner会让100个虚拟用户同时点击报案确认按钮(如果有的用户还没运行到集合点,先到用户要等未到用户一起操作)进行报案,从而达到测试目的。 最后一个为设置验证点键,在创建事物后,设置一个验证点可以用来确认事物执行是否成功。比如进行查询事务操作时,LR只要检测到网页的响应,就认为事务pass,而不管显示页面内容是否正确。因此为了检查Web服务器返回的网页是否正确,可以插入Text/Image检查点,验证网页上是否存在指定的Text或Image。 设置验证点时,如果我们验证的文本内容是中文,有时会返回无法找到验证内容的报错信息,而页面显示又是正确的,出现问题的原因可能是因为LR对中文的支持部好,尽量选择验证信息为数字或字母;也可能是设置问题,可以尝试将Tools-Recording Options-HTTP Properties下的Advanced选项里设置支持UTF-8,再检查开发人员有没有设置支持中文。 录制结束后,先点击保存脚本,同时为脚本命名。然后编译脚本,看是否存在语法错误,编译成功后,即可回放,看录制脚本是否成功。 LoadRunner录制得到的脚本基本没有错误,不像robot会有录入数据的缺失,只是会录入一些非录入系统的网页信息,根据地址可以识别并删除掉。 四. LoadRunner脚本录制学习小结 1. LoadRunner录制脚本,主要是为了进行压力测试,所以跑流程时,跑了主要流程即可,也就是系统必须的信息录入就可以了。 2. LoadRunner的脚本运行过程中,只能用于一次业务办理的数据需要做参数化,如车辆车架号,车牌,报案号等,以免出现重复投保或报案无法立案现象,不能继续进行下去。参数化步骤: 1) 将需要做参数化的数据右键点击,选择Replace with a parameter,进行设置。 2) 在弹出编辑框里,设置易懂的参数名称,再点击Properties进行属性设置。 3) 点击Create Table 按钮,生成参数表格,再点击Edit with Notepad按钮,即可在记事本里添加新的参数,添加完后再次回车(不回车可能最后条数据读取不到)关闭,参数化操作完成。 4) 使用Ctrl +H键可以找到替换同样的需要参数化的数据。 3. 脚本跑流程过程中,因为业务运转,前面生成的投保单要接着进行提交核保业务,而每次生成的投保单号不一样,用于进行提交核保的单号也要与之前的保持一致,因此需要做关联处理,读取到生成的新投保单号给提交核保流程。关联步骤: 1) .查找关联数据第一次出现的位置,判断该数据是由什么函数返回的。 2) .在树形结构里点击返回该数据值的函数,看它的Server Response信息,用复制的关联数据进行查找它的返回语句,找到区分度明显的语句(不一定要是第一个返回语句),然后使用web_reg_save_param函数进行关联。 注:关联函数一定要写在第一个返回该数据值的函数前。 3) .web_reg_save_param (const char *ParamName, List ofAttributes, LAST); 函数的第一个参数是用来对关联数据进行定义的,取名最好可读性强;第二个参数是用来标识关联数据在返回语句里的具体位置的,写出该数据的左右边界,程序才能识别;LAST表示属性列的结束。比如办理理赔业务的流程号,在服务器的返回语句里是: input name=flowID type="hidden" value=L05012009110000035215 做关联为: web_reg_save_param("LogFlowID", "LB=name=flowIDtype=\"hidden\" value=", "RB=", LAST); 定义的参数名就叫LogFlowID,表示流程号,易于明白;左边界从name取就可以标识了,也可取长点或短点,只要能区分;右边界只有,写上就好;最后写上LAST。 在定义的左右边界中,如果有双引号,在脚本中是需要转义的,因为双引号在C中是有意义的,这里只要表示语句信息,加上右斜杠。尖括号直写。 左右边界也需要用双引号括起来。定义好的参数写在程序中,需要在加上单尖括号:swfLogFlowID={LogFlowID} 五. 脚本执行过程中的报错处理 1. vuser_init.c(3051):Error -26377: No match found for the requested parameter"proposalNo". Check whether the requested boundaries exist in theresponse data. Also, if the data you want to save exceeds 256 bytes, useweb_set_max_html_param_len to increase the parameter size [MsgId: MERR-26377] 2. vuser_init.c(3051):web_submit_data("UIPrPoEnInputNext.jsp") highest severity level was"ERROR", 4312 body bytes, 258 header bytes [MsgId: MMSG-26388] 两个错误一起出现,出错语句都是在关联函数下的提交数据函数位置,但是具体出错有可能是: 1). 关联函数左右边界没写对,所有信息都要用字符输入,不能是中文或其他。 2). 在关联函数确认写对的情况下,看提交数据函数中的业务设置,比如有可能是因为保单查询语句,设置的查询时间是过去的时间,新生成的投保单当然查不到,这样程序也会报这样的错。 3. loadrunner 执行理赔的立案处理,录制好脚本后,回放,报错: 脚本日志信息提示: 1.Action.c(400):Error -26366: "Text=立案信息提交成功" not found for web_reg_find [MsgId: MERR-26366] 2.Action.c(400):web_submit_data("claimSave.do") highest severity level was"ERROR", 4424 body bytes, 258 header bytes [MsgId: MMSG-26388] 脚本执行过程停止在立案信息提交页面,错误原因:数据问题,可能是有的应该变化的信息没有变。 在该流程中,一个报案号只能做一次立案,而初始脚本没有设置参数、关联,使用保单号进行查询,错误被掩盖。在立案系统中,一个保单号可以重复报案,但是一个报案号只能一次立案,要跑通流程,需要先将这一保单再重复报案,得到新的报案号。 六. 性能测试的场景设置 脚本录制完毕后,接着准备测试场景。 1.首先准备测试数据。比如车险投保,需要投保人和车架号信息来唯一标识一辆被保车,因此就需要将投保人和车架号做参数化处理,编辑文本框录入大量数据让脚本唯一读取: 1). 录入投保人参数,车架号参数,过程同脚本录制的参数化处理 2). 因为投保人和车架号一起生成一条投保数据,可设置车架号随投保人参数一起读取,设置步骤为: 投保人文件存放路径--File path 投保人参数数据读取方式 脚本按列名读取参数,每行数据读取一次,每次循环取一次新值。 接着设置车架号参数信息: 车架号参数读取文件路径设为和投保人文件路径一样 脚本按列名读取参数,行号选择和读取的投保人数据同一行 这样得到所需的投保单生成参数数据 2.设置测试场景 点击Tools-Create Controller Scenarios,弹出场景类型选择框: 录入需要的虚拟用户数,选择生成结果存放路径和组名。确定后进入具体设置页面: Quantity表示虚拟用户个数,group name为组名。 1). 设置运行时间选项Run – time Settings 选择循环次数Run Logic-Iteration Count,设置循环10次,虚拟用户数为之前设置的5人,则预计一共可生成50张投保单。 设置思考时间,思考时间通常是录制脚本过程中,填写页面信息花费的时间,选择忽略项,节省跑脚本的时间。 设置网络连接时间,点击网络协议项Internet Protocol 的Options键,将弹出页面里的HTTP-request connect timeout和 HTTP-request receive timeout的数值改为1000。使得能在网络状况不太好的情况下向服务器发送接收数据。 2). 设置EditSchedule 选择虚拟用户加载方式: 可以一次加载所有用户,也可以按需要设置,一秒加载一个用户或其他。 选择结束方式: 当选择一秒加载一个用户时,结束设置为直到跑完所有脚本停止执行。如果选择选择一次加载所有用户可以选择运行多少时间后停止和不停止选项。 这些设置完成后,一次测试场景布置完成。可以进行基线检查或单点并发测试。 七. 性能测试步骤 一). 除测试工具外性能测试必备的系统及业务知识 1、熟悉保险行业业务特点,有助于与开发和客户讨论需求,制定测试用例; 2、熟悉系统的实现特点,开发实现方式,有助于选择程序处理复杂、消耗系统资源的用例点; 3、熟悉数据结构,了解数据存储规则,对脚本调试、数据准备、测试执行和监视都有帮助; 4、熟悉系统所使用的数据库、操作系统、中间件的监视和性能问题查看,有助于测试监视和发现问题; 5、熟悉系统架构及系统集成方式,有助于分析及明确定位性能问题。 二) 性能测试执行过程 1. 基线检查 1).目的:验证环境是否可用; 验证脚本是否能在场景正常执行。 2).方法:1个人单独循环5次--没有其他人干扰,干净的环境 3).结果:一般一个事物的响应时间超过3秒就可能存在问题,要提报开发人 2. 单点并发 1).目的:为了快速的发现问题,如多进程的锁机制,看是否相互间有影响。 2).方法:一般是10人或20人执行10到15分钟,执行过程忽略思考时间。 忽略思考时间可以减少客户端时间,加快向服务器传送数据速度,很大程度上增大了服务器的压力,20个人单点并发的压力就相当于200人正常执行带给服务器的压力。 3).单点测试的数据可以用来进行混发测试,但是有可能单点测试的数据不足以进行混发,需要自己再准备足够的数据。 3.方案测试--混发测试 1).目的:模拟生产环境 2).方法:执行1小时左右,加上思考时间 八.资源监控及调优 性能测试执行过程中,需要监控系统各项资源,看是否能满足用户实际需要,如内存使用,SQL SERVER等,结合LR生成的分析报告,分析系统哪里可能存在问题,需要改进,进行调优,这也是我之后要接着进行学习的地方。 1. 学习使用weblogic,了解weblogic常配参数的意义。通过weblogic自身的监控台,可以了解到目前的JVM的大小、数据库连接池的使用情况以及目前连接的客户端数量以及请求状况等等。 2. 学习oracle使用,熟悉它的体系结构,尤其是oracle10里 的awr,awr能采集与统计数据,并从那些统计数据中导出性能量度,以跟踪潜在的问题。 3. 需要继续学习LR的理论知识和实际操作,参考书籍《Web性能测试实战》、《软件性能测试过程详解与案例剖析》