这两天公司项目需要用到数字证书,把N年前的代码找回来贴上
package com.jinhill.util; import java.io.*; import java.security.*; import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; import java.util.Properties; public class Test { public static String getSubjectDN(byte[] der) { String dn = ""; try { ByteArrayInputStream bIn = new ByteArrayInputStream(der); // BouncyCastleProvider provider = new BouncyCastleProvider(); // CertificateFactory cf = CertificateFactory.getInstance("X509", // provider); CertificateFactory cf = CertificateFactory.getInstance("X.509", "SUN"); X509Certificate cert = (X509Certificate) cf .generateCertificate(bIn); dn = cert.getSubjectDN().getName(); bIn.close(); } catch (CertificateException e) { e.printStackTrace(); } catch (NoSuchProviderException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return dn; } public static String parseCertDN(String dn, String type){ type = type + "="; String[] split = dn.split(","); for (String x : split) { if (x.contains(type)) { x = x.trim(); return x.substring(type.length()); } } return null; } /** * @param args */ public static void main(String[] args) { try { FileInputStream fis = new FileInputStream( "D:/Work/RootCA/newcerts/Reader01.cer"); int flen = fis.available(); byte[] buf = new byte[flen]; fis.read(buf, 0, flen); String dn = getSubjectDN(buf); String cn = parseCertDN(dn, "CN"); System.out.println(cn); } catch (Exception ex) { System.out.println("读证书文件出错!"); } } } |
今天做了点东西,用到的东西比较杂,总结下,以备以后查阅:
1、首先需要将c#连数据库查出的一条记录的每个字段值取出来,我是将这条记录的字段放在了一个数组中,如下:
string[] Infos=new string[3]; public Array show2DcodeMsg(string id) { SqlConnection connection = new SqlConnection(strCon); String str = "SELECT ZCCCode,ZCCAddr,OfUserName FROM tbZCCInfo WHERE ZCCCode=" + id; SqlCommand command = new SqlCommand(str, connection); command.Connection.Open(); command.ExecuteNonQuery(); SqlDataReader datareader = command.ExecuteReader(); while(datareader.Read()) { string ZCCCode = datareader["ZCCCode"].ToString(); string ZCCAddr = datareader["ZCCAddr"].ToString(); string OfUserName = datareader["OfUserName"].ToString(); Infos[0] = ZCCCode; Infos[1] = ZCCAddr; Infos[2] = OfUserName; } return Infos } |
我做的是http请求,参数获得是需要在page_load函数中提取,然后调用上面这个函数,大概后台代码是这样的:
protected void Page_Load(object sender, EventArgs e) { q_id = Request.QueryString["ID"]; if (q_id == null || q_id == "") { return; } { show2DcodeMsg(q_id); } } |
前台的网页需要用到上面获取的Infos[]的值,这里一般都知道要在前台调用后台方法了,方法有ajax和jquery等,最简单的就是<%=方法名%>这种方式了,但是这里问题来了,是要<%=Page_Load(object sender, EventArgs e)%> ?这显然不合适,从参数上来说也能这么传,再说也没有调用Page_load这一说,怎么办呢?我是直接另写了三个方法:
public string returncode() { return Infos[0]; } public string returnAddr() { return Infos[1]; } public string returnName() { return Infos[2]; } |
这样在前台直接调用这三个方法不就行了。前台代码如下:
<script type="text/javascript" language="javascript"> var code="<%=returncode() %>"; var addr="<%=returnAddr() %>"; var name="<%=returnName() %>"; function showInfos() { // var img123=doucumen.getElementById("imgCar"); // img123.src="images/"+code+".jpg"; imgCar.src="images/"+code+".jpg"; li_num.innerHTML=code; li_addr.innerHTML=addr; li1.innerHTML=name; } </script> |
方法showInfos()是在body的onload里执行。执行结果就是,运行网页,发送请求,查询数据库,返回的字段值直接显示在网页的控件上。
后面还用到一个asp:Button的一个onclick事件,往服务器里上传数据,asp是服务其空间,只能直接调用后台cs方法,这个比较简单,直接就能调,问题来了:
前台: <asp:Button ID = "testBtn" Text = "评价" runat = "server" onclick="submit"/> 后台: protected void submit(object sender, EventArgs e) { ... } |
这是固定的格式,要注意几个地方:
(1)前台方法名没有括号
(2)后台方法有参数,并且就这样,我也不知道原因
一开始我前台加括号,后台没参数,感觉太正常不过了,结果报错了
submit 重载均与委托system.eventHandler不匹配。重载出问题自然就想到参数的问题了,但是不加括号不知道为什么,记住吧。
这个面试题碰到过很多次, 再次总结下来。
具体需求: 有一个登陆页面, 上面有2个textbox, 一个提交按钮。 请针对这个页面设计30个以上的test case.
此题的考察目的: 面试者是否熟悉各种测试方法,是否有丰富的Web测试经验, 是否了解Web开发,以及设计Test case的能力
这个题目还是相当有难度的, 一般的人很难把这个题目回答好。
阅读目录
功能测试(Function test)
1.输入正确的用户名和密码,点击提交按钮,验证是否能正确登录。
2.输入错误的用户名或者密码, 验证登录会失败,并且提示相应的错误信息。
3.登录成功后能否能否跳转到正确的页面
4.用户名和密码,如果太短或者太长,应该怎么处理
5.用户名和密码,中有特殊字符,和其他非英文的情况
6.记住用户名的功能
7.登陆失败后,不能记录密码的功能
8.用户名和密码前后有空格的处理
9.密码是否以星号显示
界面测试(UI Test)
1.布局是否合理,2个testbox 和一个按钮是否对齐
2.testbox和按钮的长度,高度是否复合要求
性能测试(performance test)
1.打开登录页面,需要几秒
2.输入正确的用户名和密码后,登录成功跳转到新页面,不超过5秒
安全性测试(Security test)
1.登录成功后生成的Cookie,是否是httponly (否则容易被脚本盗取)
2.用户名和密码是否通过加密的方式,发送给Web服务器
3.用户名和密码的验证,应该是用服务器端验证, 而不能单单是在客户端用javascript验证
4.用户名和密码的输入框,应该屏蔽SQL 注入攻击
5.用户名和密码的的输入框,应该禁止输入脚本 (防止XSS攻击)
6.错误登陆的次数限制(防止暴力破解)
可用性测试(Usability Test)
1. 是否可以全用键盘操作,是否有快捷键
2.输入用户名,密码后按回车,是否可以登陆
兼容性测试(Compatibility Test)
1.主流的浏览器下能否显示正常已经功能正常(IE,6,7,8,9, Firefox, Chrome, Safari,等)
2.不同的平台是否能正常工作,比如Windows, Mac
3.移动设备上是否正常工作,比如Iphone, Andriod
4.不同的分辨率
软件辅助性测试 (Accessibility test)
软件辅助功能测试是指测试软件是否向残疾用户提供足够的辅助功能
1. 高对比度下能否显示正常 (视力不好的人使用)
相关文章:
软件测试面试 (一) 如何测试一个杯子
本节重点:
调用js方法
execute_script(script, *args)
在当前窗口/框架 同步执行javaScript
脚本:JavaScript的执行。
*参数:适用任何JavaScript脚本。
使用:
driver.execute_script(‘document.title’)
使快播登陆用户名输入框标红显示:
#coding=utf-8 from selenium import webdriver import time driver = webdriver.Firefox() driver.get(http://passport.kuaibo.com/login/?referrer=http%3A%2F%2Fvod.kuaibo.com%2F%3Ft%3Dhome) #给用户名的输入框标红 js="var q=document.getElementById(\"user_name\");q.style.border=\"1px solid red\";" #调用js driver.execute_script(js) time.sleep(3) driver.find_element_by_id("user_name").send_keys("username") driver.find_element_by_id("user_pwd").send_keys("password") driver.find_element_by_id("dl_an_submit").click() time.sleep(3) driver.quit() |
js解释:
q=document.getElementById(\"user_name\")
元素q的id 为user_name
q.style.border=\"1px solid red\
元素q的样式,边框为1个像素红色
隐藏元素
js.html
<html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8" /> <title>js</title> <script type="text/javascript" async="" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <link href=http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css rel="stylesheet" /> <script type="text/javascript"> $(document).ready(function(){ $('#tooltip').tooltip({"placement": "right"}); }); </script> </head> <body> <h3>js</h3> <div class="row-fluid"> <div class="span6 well"> <a id="tooltip" href="#" data-toggle="tooltip" title=" selenium-webdriver(python)">hover to see tooltip</a> <a class="btn">Button</a> </div> </div> </body> <script src="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.min.js"></script> </html> |
(保持html文件与执行脚本在同一目录下)
执行js一般有两种场景:
一种是在页面上直接执行JS
另一种是在某个已经定位的元素上执行JS
#coding=utf-8 from selenium import webdriver import time,os driver = webdriver.Firefox() file_path = 'file:///' + os.path.abspath('js.html') driver.get(file_path) #######通过JS 隐藏选中的元素######### #第一种方法: driver.execute_script('$("#tooltip").fadeOut();') time.sleep(5) #第二种方法: button = driver.find_element_by_class_name('btn') driver.execute_script('$(arguments[0]).fadeOut()',button) time.sleep(5) driver.quit() |
js解释:
arguments对象,它是调用对象的一个特殊属性,用来引用Arguments对象。Arugments对象就像数组。
fadeOut() 方法使用淡出效果来隐藏被选元素,假如该元素是隐藏的。
PS:可以看到js 可以做selenium 做不到的事情,但是在什么样的自动化的时候才能(或必须)要js帮忙,我还没遇到过。不过js可以selenium完成更强大的功能,这是不容置疑的。
另外,之前没有学过JS ,所以js代码很陌生。如果有时间的话也建议各位同学补充这方面的知识。UI自动化离不开前端技术。
相关文章:
轻松自动化---selenium-webdriver(python) (七)
轻松自动化---selenium-webdriver(python) (九)
新的项目中,需要向应用发送一个中文的人名: payerName : 张三,调用失败。,观察错误日志,发现 传过去的payerName是乱码。
解决过程:
1. Virtual User Gen的Tools->Recoding Options -> Advanced -> Support charset -> UTF-8
重试之,无效。。。
2. 使用lr_convert_string_encoding函数进行强制转码。
lr_convert_string_encoding: 对中文进行UTF-8转码 int lr_convert_string_encoding ( const char *sourceString, const char *fromEncoding, const char *toEncoding, const char *paramName); 该函数有4个参数,含义如下: sourceString:被转换的源字符串。 fromEncoding:转换前的字符编码。 toEncoding:要转换成为的字符编码。 paramName:转换后的目标字符串。 |
注意: 使用这个函数转码出来的字符串会以 \x00 结尾,所以要做一次额外处理。
代码如下:
char tmp[50]; lr_convert_string_encoding("张三", LR_ENC_SYSTEM_LOCALE,LR_ENC_UTF8,"str"); strcpy(tmp,lr_eval_string("{str}")); lr_save_string(tmp,"payerName"); |
然后再使用 如下方式进行调用:
web_custom_request("consume", "URL=http://192.168.12.89:8010/quickpay/v10/003", "Method=POST", "Resource=0", "RecContentType=application/json", "Referer=", "Mode=HTTP", "EncType=application/json", "Body={\"cardHolderName\":\"{payerName}\",\"cardNo\":\"4392260802828457\",\"cardTypeEnum\":\"CREDI\"}", LAST); |
再次运行脚本,OK了。
学习本文你到底要学到什么:
1、 static在java中到底代表什么,为何要用它?
2、 static在java中怎么用?
3、 static 有那些特点和使用的“局限”
1、 static在java中到底代表什么,为何要用它?
static――静态――“指定位置“
首先,我们来看看java的内存:java把内存分为栈内存和堆内存,栈内存用来存放一些基本类型的变量和数组及对象的引用变量,而堆内存主要是来放置对象的。
用static的修饰的变量和方法,实际上是指定了这些变量和方法在内存中的“固定位置”-static storage。既然要有“固定位置”那么他们的“大小”似乎就是固定的了,有了固定位置和固定大小的特征了,在栈中或堆中开辟空间那就是非常的方便了。如果静态的变量或方法在不出其作用域的情况下,其引用句柄是不会发生改变的。
我们常看到:static变量有点类似于C中的全局变量的概念;静态表示的是内存的共享,就是它的每一个实例都指向同一个内存地址。把static拿来,就是告诉JVM它是静态的,它的引用(含间接引用)都是指向同一个位置,在那个地方,你把它改了,它就不会变成原样,你把它清理了,它就不会回来了。我们常可看到类似以下的例子来说明这个问题:
package com.meritit.test; class Student { static int numberOfStudents = 0; Student() { numberOfStudents++; } } |
每一次创建一个新的Student实例时,成员numberOfStudents都会不断的递增,并且所有的Student实例都访问同一个numberOfStudents变量,实际上int numberOfStudents变量在内存中只存储在一个位置上。
多个实例共享一个变量似乎不足以让我们对static那么的热情,实际上java引入static却有另外的含义:
(1)、引用static的方法和变量,不需要和实例捆绑在一起,这可以提高代码的编写的效率,这样的例子我们随处可见;
(2)、java的主类中main()方法本身就是一个static的,所以main方法的执行就是在没有产生新的实例的情况;对于静态的东西,JVM在加载类时,就在內存中开辟了这些静态的空间,所以虽没有静态的main()方法但是程序还是执行了,不过抛出来了无main()方法的异常。这也不知算不算是java的一个漏洞;
(3)、如果需要创建一个脱离于实例的变量或方法(只与整个类有关),那么用static作修饰是再好不过了,如我们经常看到要统计实例实现的个数(通常的例子就是计数)。
(4)、使用一种静态的方法的编程通常叫做防御(defensive)编程,它可以在API供应商突然中断支持的情况下保护代码
static在java中怎么用?
使用static时,要记着我阐述的static代表什么。
static使用非常的简单,如果要修饰一个静态块只需:staic {……..}即可(常用静态块来初始化一些变量); 静态方法就参照main()的形式:访问标识 static returnType method(…) {};静态变量就是:static type fields;
在使用静态的方法时,可以直接用类名来引用,不需要创建实例(当然创建实例也是可以的),例如,System.out,String.valueOf()等等。
3、 static 有那些特点和使用的“局限”?
从上面的分析可知,static的东西在类加载时,就分配了内存空间,即编译时就为这些成员变量的实例分配了空间。
那么在static块内和方法体内,我们能给它放一个在内存中还没有着落的变量?显然与我们先前所说的相左。static的东西,人家是在static storage中有“指定位置“的,如果我们茫然的在static的作用域中放置一个普通的变量,那么编译时JVM就毫不客气的给你个异常:
non-static variable a cannot be referenced from a static context或non-static method Test() cannot be referenced from a static context(注:Test()是我试验时的一个例子),除非我在static中现场开辟空间,用new来要内存。
对于static的初始化问题,我们还是值得讨论的。现看下面的例子
package com.meritit.test; public class StaticInit { static int i; int a; public StaticInit() { a=6; System.out.println("a 的初始化"+a); } public static void main(String[] args) { new StaticInit(); } static { i=5; System.out.println("i 的初始化"+i); } } |
运行结果如下:
i 的初始化5
a 的初始化6
静态块的初始化要早于非静态的,原因就是在于这些东西是在类装载时就开始初始化了。
说起static的“局限“,总结起来就是:在static的方法中仅能够调用其他的static方法和static变量;在static方法中不能以任何方式引用this或super;static变量在定义时必须进行初始化,并且初始化的时间早于非静态。还有一个局限我需要具体的说明一下,static的变量的初始化仅能一次,如下例:
package com.meritit.test; public class Static { T1 t1 = new T1(2); T1 t2 = new T1(3); T1 t3 = new T1(4); public Static() { System.out.println("t1: " + t1.t); System.out.println("t2: " + t2.t); System.out.println("t3: " + t3.t); } public static void main(String args[]) { new Static(); } } class T1 { static int t = 1; T1(int b) { t = b; } } |
运行结果:
t1: 4
t2: 4
t3: 4
该static变量只是接受了最后一次的初始化.实际这还是我们先前提到的多个实例共享一个静态的变量的问题。
总之,static就是给我们一个这样的忠告:static的东西在编译时,就已向内存要到了存取空间了。
近项目用到了oracle,使用的是oracle10g,因为小组内有多人使用数据库,并且oracle数据库很占内存,就放在单独的一台服务器上,所以最好每个人都装一个oracle10g的客户端。那么客户端到数据库的远程访问时免不了的了。
其实远程访问很简单,但是我在实施的过程确实无比的艰辛。网上好像根本就没有什么类似的资料。自己好不容易装好了,就写下来,希望对需要的人有点用。
我的oracle服务器所在的系统是windows2003,客户端所在的系统是XP的。
1. 在服务器端建立数据库,比如叫WebSite。(最好别超过8个字符,自己试验过,超过一定字符的话,远程访问的时候输入服务名,会显示服务名无效。后来上网上查的,8i上不能超过8个字符)。此时,数据库名字就叫WebSite,SID也是WebSite。
2. 在客户端配置net configuration Asistence。这个工具可以对远程的连接进行设置和测试。首先选择“本地Net服务名配置”,“添加”。出现“服务名”选项要填(服务名其实就是你自己对远程数据库的一个标示,你可以和远程数据库的名字一样,也可以自己随意取一个,只要你知道他对应的是那个远程数据库就行了。)。假入我填上“website”,选择“TCP”,填写“主机名”,就是远程数据库所在的主机的IP,然后可以选择测试,也可以暂时不进行测试。
3. 在Net Manager这个工具中,在左边的树状结构中,可以看到刚才配置的那个服务了,以及他的一些信息。也可以在这个工具中进行配置服务,也可以测试。总之,这两个工具都是可以对远程连接的成功性进行测试的。注意,在这两个工具中进行测试的时候,如果测试不成功的话,可以更改一下测试时使用的用户名和密码。然后再测试。
4. 如果测试成功的话,现在就可以对远程数据库的访问了。即可用SQL/PLUS这种工具,也可以使用Enterprise Manager Console这种图形化工具。在SQL/PLUS进行连接中,“主机字符串”填写的就是在NetConfiguration Assistence或Net Manager中配置的服务名就可以了,如在上述的环境下,服务名为website,则登录的时候“主机字符串”就为“website as sysdba”。前提必须是在这两个工具中进行了配置。(呵呵,废话!)。使用Enterprise Manager Console的时候,需要手动添加数据库到树状结构中,在顶上的按钮中有。然后还是一些IP和SID的设置之类的。这些都和前边的很相似,不再详述。登录远程数据库的时候,最好用sys用户名,使用system没有DBA的权限。
在软件测试的面试中, 经常会碰到类似的问题。 比如:如何测试一个杯子, 或者如何测试一只笔。 要求你设计20个以上的test case.
这类的面试题目,是考察面试者是否熟悉各种软件测试方法, 设计test case的能力, 以及test sense。
首先应该反问下面试官, 需求是什么样的,比如大概是个什么样的杯子。
我回答这类问题的思路, 从软件测试的各种不同方法来联想, 具体如下。
功能测试(Function test)
1.能否装水,
2.除了装水, 能否装其他液体。比如可乐,酒精
3.能装多少ML的水
4.杯子是否有刻度表
5.杯子能否泡茶,跑咖啡
6.杯子是否能放冰箱,做冰块
7.杯子的材质是什么(玻璃,塑料,黄金做的)
界面测试(UI Test)
1.外观好不好看。
2.什么颜色
3.杯子的形状是怎么样的。
4.杯子的重量是多少
5.杯子是否有异味
6.杯子的图案是否合理
性能测试(performance test)
1.能否装100度的开水 (泡茶)
2.能否装0度冰水
3.装满水,放几天后,是否会漏水
4.杯子内壁上的涂料是否容易脱落。
5.杯子上的颜色是否容易褪色或者脱落
6.被我坦克压下,是否会碎 (这条是开玩笑的哈)
安全性测试(Security test)
1.制作杯子的材料,是否有毒
2.放微波炉里转的时候,是否会爆炸, 或者杯子是否会熔化。
3.从桌子上掉到水泥地上是否会摔碎。
4.杯子是否容易长细菌
5.杯子是否有缺口,会划坏嘴巴
6.杯子内壁上的材料,是否会溶解到水中
7.杯子破碎后,是否会对使用者造成伤害
可用性测试(Usability Test)
1.杯子是否容易烫手
2.杯子是否好端,好拿
3.杯子的水是否容易喝到
4.杯子是否有防滑措施
总结
一不小心, 就写了30多个test case。
下次碰到 “如何测试一台自动售货机” 这样的问题, 按照相同的思路, 也能容易的回答出来。
相关文章:
软件测试面试 (二) 如何测试网页的登录页面
一:单元测试、集成测试、系统测试和验收测试(确认测试);
二:测试需求分析,测试计划编写,测试用例编写,测试,缺陷记录,回归测试,判断测试结束,测试报告提交。
三:测试流程依次如下:
1.需求:阅读需求,理解需求,与客户、开发、架构多方交流,深入了解需求。--testing team
2.测试计划: 根据需求估算测试所需资源(人力、设备等)、所需时间、功能点划分、如何合理分配安排资源等。---testing leader or testing manager
3.用例设计:根据测试计划、任务分配、功能点划分,设计合理的测试用例。---testing leader, senior tester
4.执行测试:根据测试用例的详细步骤,执行测试用例。--every tester(主要是初级测试人员)
5.执行结果记录和bug记录:对每个case记录测试的结果,有bug的在测试管理工具中编写bug记录。--every tester(主要是初级测试人员)
6.defect tracking:追踪leader分配给你追踪的bug.直到 bug fixed。--every tester
7.测试报告:通过不断测试、追踪,直到被测软件达到测试需求要求,并没有重大bug.
8.用户体验、软件发布等……
楔子:测友们总是再问lr测试同时怎么监控服务器的资源!---发生在胡胡测试群中的故事
本人秉着说错了无所谓--咱改! 大不鸟挨砖的态度写下这篇文章!
hp loadrunner的监控已经做的很好了,可以监控多种资源,譬如:
1.unix(linux)服务器资源(需要在unix服务器安装rstatd守护程序==)
2.监控windows服务器资源(需要对所监控的服务器有相应的访问权限)
3.apache资源(需要动态加载一个apache的库对监控作为支持)
4.welogic资源(需要在服务器端安装jdk 修改xml权限配置==)
还有好多,用lr监控服务器资源
优点:可以实时查看并能记录到analysis中而且能和其他资源合并比较。
缺点:存在一点的延时,优点中的“实时”也就找洞别见人了!耗费资源:rstatd守护程序比较
好资源,且稳定性不好,容易死掉,自己实测遇到N次,找运维、开发讨论多次无果果断放弃使用。---这些缺点主要针对unix资源监控,因为我用的比较多!
推荐监控方式。
1.windows资源监控 可以使用自带的性能计数器。
优点:可以导出监控log,在analysis中导入数据生成图表。
缺点:感觉麻烦。
2.spotlight for windows(这个比较喜欢 还有for oracle、for linux不同的版本)
3.unix(linux)监控工具--nmon
优点:可实时监控。且记录到文本用nmon_analysis转换成图表。
4.unix(linux)监控工具--nagios
优点:太多了 监控项也比较全,不够的还能自己写脚本加入!
缺点:俗称“难搞死”。第一次弄的时候弄了1天才弄好。
5.linux监控工具--zabbix
优缺点未知,运维的哥们给介绍的!
6.linux监控工具--spotlight for linux
7.jvm监控工具--jconsole
8.在linux下还可以使用自带的命令,如:vmstat sar iostat netstat top 很多,可以用python或者shell写脚本 实用啊!
一句话就是:比较推荐nmon、nagios和自带命令--linux 性能计数器--windows!