Jenkins旨在编程的持续继承,测试部署自动化,官方给的简介如下:
Jenkins is a self-contained, open source automation server which can be used to automate all sorts of tasks such as building, testing, and deploying software. Jenkins can be installed through native system packages, Docker, or even run standalone by any machine with the Java Runtime Environment installed.
首先下载 Jenkins 的war包jenkins.war运行命令
$ java -jar jenkins.war
该命令会在本地的8080端口运行jenkins访问 localhost:8080 会看到jenkins 的欢迎界面,按照步骤依次进行设置。在安装插件的界面,选择默认即可,jenkins会帮你安装一些常见的插件,比如git,pipeline等设置结束后会看到如下界面点击左上角新建按钮,即可新建一个项目,这里我们选择新建一个maven项目。在github project选项上选择我们的github地址在源码管理设置上选择git,并设置默认编译的分支为主分支
阅读全文
软件测试小组作业之JPF
首先先说说JPF是个什么东西
官方给出的解释:
JPF核心是用于Java™字节码的虚拟机(VM),这意味着它是一个程序,您可以让Java程序执行。它用于在这些程序中找到缺陷,因此您还需要给出属性以作为输入进行检查。 JPF通过一份报告来回复,该报告说如果属性持有和/或由JPF创建的验证工件进行进一步分析(如测试用例)。
JPF是一个有几个扭曲的虚拟机。它在Java本身中实现,所以不要指望它像您的普通Java一样快速运行。它是在VM上运行的VM。虽然Java字节码的执行语义在http://java.sun.com/docs/books/jvms/second_edition/html/VMSpecTOC.doc.html/ Sun的Java虚拟机规范中有明确定义,但我们在JPF中几乎没有硬连线语义 - VM指令集由一组可被替换的类表示。
默认指令集使用下一个JPF功能:执行选项。 JPF可以识别您的程序中的执行可能不同的进程,然后系统地探索所有这些点。这意味着JPF(理论上)通过程序执行所有路径,而不仅仅是像普通的VM那样。典型的选择是不同的调度序列或随机值,但JPF可以再次介绍您自己的类型,如用户输入或statemachine事件。
个人觉得JPF是一个针对JAVA程序寻找可执行路径的工具。看了一下官方的例子,觉得JPF可以在JAVA程序执行时自动检测所有的可执行路径,找到可能出现问题的路径。不同于传统的基于用例的Testing,JPF采用的是Model Checking,尽管基于用例的测试在用例足够多的时候有着很不错的测试效果,但是很难保证测试到所有的可行路径。JPF官方给出了基于测试用例的Testing 与 Model Testing 的差别:
阅读全文
Selenium 用于WEB程序测试,可以录制下来点击过程的脚本,并自动进行测试。
使用selenium-ide 进行脚本录制
使用java编写selenium程序,实现自动验证
使用selenium-ide 进行脚本录制在开始实验之前,需要安装所需要的软件。首先想要使用selenium-ide,需要是用firefox浏览器。firefox下载链接selenium-ide下载链接将下载后的selenium插件拖到firefox里即可自动安装。成功安装后,在firefox中可以打开selenium插件:选择开发者工具中的selenium-ide打开后长这个样子在1的位置输入想要测试的网址,接着点击2位置的按钮开始录制。去浏览器访问对应的网站,完成表单提交操作,回到selenium-ide会看到录制下来的case,最后点击4,会将当前所有的case执行一遍。
使用java编写selenium程序,实现自动验证新建一个java项目,然后导入下列jar包
阅读全文
记录记录自己踩过的坑
按照官方文档,乖乖的用composer进行安装:
$ composer global require "laravel/installer"
然后,就给我报了噼里啪啦一堆错误
[Composer\Downloader\TransportException]
The "https://packagist.org/packages.json" file could not be downloaded: fai
led to open stream: Connection timed out
EXM?我还啥也没干呢啊 = =。然后吧,我就把这个错误扔到了google上,注意了注意了,划重点了!搜出来解决方案的没有一个可以用的!然后我发现只是单纯的被墙了而已。WHAT THE FUCK !!!解决办法也挺简单,把composer的源切成国内镜像就好了
$ composer config -g repo.packagist composer https://packagist.phpcomposer.com
具体的可以参见 Packagist / Composer 中国全量镜像 这里。接下来就可以愉快的使用laravel了
$ composer global require "laravel/installer"
使用laravel新建一个项目,然后就可以看到牛逼闪闪的lavavel的目录结构:
$ laravel new myProject
阅读全文
这是个悲伤的故事,海痴的linux出了点毛病,然后就想着重装一遍。掐指一算,自家的代码在git上面都保存了,直接重装!然后吧,hexo你大爷,你没事就不能把博客原文备份一下么?又不占你的空间!那么费劲么!是的,海痴的博客都没了,别问我为什么还能看着,宝宝复制粘贴都快吐了,弄到凌晨两点多才恢复了。这件事情告诉我们,没事闲的别重装系统。
具体的思路就是在我们的博客仓库中新建一个分支,用来保存源码,master分支用来提交hexo自动生成的文件。以海痴的博客为例。打开wanghaichi.github.io工作目录,我们可以喜闻乐见的发现没有.git文件夹。那么接下来的事情就简单了打开工作目录,执行以下操作
$ git init
$ vi .gitignore
.DS_Store
Thumbs.db
db.json
*.log
.deploy*/
node_modules/
.npmignore
public/
$ git branch -b hexo
$ git add .
$ git commit -m "backup"
$ git remote add origin git@github.com:wanghaichi/wanghaichi.github.io.git
$ git push origin hexo
如果没设置ssh权限可能需要设置一下,然后去github仓库里面切换以下分支,你的可爱的博客就都在里面啦。以后每次写完博客,先执行一遍
$ git add .
$ git commit -m "backup"
$ git push origin hexo
再发布,就不用担心自家博客丢失啦
妈妈再也不用担心复制博客到零点啦
阅读全文
书上的练习题,要求设计相应的测试用例,写出主路径覆盖
Problem Description
Answer
Problem Description
/***********************************
* Finds and prints n prime integers
* Jeff Offutt, Spring 2003
************************************/
private static void printPrimes (int n){
int curPrime; // Value currently considered for primeness
int numPrimes; // Number of primes found so far.
boolean isPrime; // Is curPrime prime?
int [] primes = new int [MAXPRIMES]; // The list of prime numbers.
// Initialize 2 into the list of primes.
primes[0] = 2;
numPrimes = 1;
curPrime = 2;
while(numPrimes < n){
curPrime++; //next number to consider ...
isPrime = true;
for(int i = 0; i <= numPrime-1; i++){
if(isDivisible(primes[i], curPrime)){
isPrime = false;
...
阅读全文
之前每次都死在这里,这把终于搞明白了。弄个虚拟主机的目的是将多个项目都可以跑在虚拟域名的根目录下,在本地调试结构也比较清晰。
首先备份一份 default 配置文件
$ sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak
接下来以example.com域名为例
$ sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/example.com.conf
修改新的配置文件的内容
server {
listen 80;
listen [::]:80;
server_name example.com;
root /var/www/example.com;
index index.html index.php;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass 127.0.0.1:9000;
}
location ~ /\.ht {
deny all;
}
}
这里你需要有对应的工作目录,将配置文件链接到 sites-enabled 中使其生效下面这里要注意了,一定要写绝对路径。
$ sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
$ sudo systemctl reload nginx
在hosts文件中加上映射
阅读全文
软件测试第一次上机,测试了一下JUnit的使用和覆盖测试,虽然实验要求是用eclipse,但我还是被idea的美色所臣服。
Junit 安装与使用
覆盖测试
Junit 安装与使用首先去官网下载Junit的jar包和其依赖
junit-4.12.jar
hamcrest-core-1.3.jar
打开Idea,新建一个项目,并在项目中与src目录平级创建test和lib文件夹,并将下载的jar包放在lib文件夹中在idea中导入junit:File>Project Structure>Modules 点击 ‘+’ 引入刚刚下载的jar包,点击 Apply将test文件夹设置为测试文件夹在test文件夹右键 > Mark Directory as > Test Resources Root回到Main.java 编写testTriangle方法
//判断一个三角形的形状:等边,等腰,普通
public s...
阅读全文
下决心不再用lamp的集成包了,自己搞一个出来。
Nginx
php
mysql
Nginx首先安装使用 apt 安装nginx$ sudo apt install nginx然而由于之前安装过nginx,卸载还不干净,导致配置文件读取失败,出现错误:
Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details.
invoke-rc.d: initscript nginx, action "start" failed.
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since 四 2017-03-09 00:06:13 CST; 7ms ago
Process: 4540 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=1/FAILURE)
3月 09 00:06:13 hardy-Inspiron-5547 systemd[1]: Starting A high performance....
3月 09 00:06:13 hardy-Inspiron-...
阅读全文
软件测试课程作业,按照要求设计相关的测试用例
问题描述
问题解答
问题描述
Below are two faulty programs. Each includes a test case that results in failure. Answer the following questions about each program.
// program 1
public int findLast (int[] x, int y) {
//Effects: If x==null throw NullPointerException
// else return the index of the last element
// in x that equals y.
// If no such element exists, return -1
for (int i=x.length-1; i > 0; i--){
if (x[i] == y){
return i;
}
}
return -1;
}
/ test: x=[2, 3, 5]; y = 2
/ Expected = 0
// program 2
public static int lastZero (int[] x) {
// Effects: if x==null throw NullPointerException
// else return the index of the LAST 0 in x.
// Return -1 if 0 does not occur in x
for (int i = 0; i < x.length; i++){
if (x[i] == 0){
return i;
}
}
return -1;
}
// test: x=[0, 1, 0]
// Expected = 2
阅读全文