1、什么是Shell
Unix操作系统下的shell既是用户交互的界面,也是控制系统的脚本语言。当然在这点也有别于Windows下的命令行,虽然也提供了很简单的控制语句。在Windows操作系统下,可能有些用户从来都不会直接的使用shell,然而在Unix系列操作系统下,shell仍然是控制系统启动、X Window启动和很多其他实用工具的脚本解释程序。
2、怎么用Shell
<1>之前听说过Shell,但是没有仔细用过,所以怎么写,怎么执行等一系列的问题都不知道。会google,就找了个简单的demo!
1
2
3
4
5
6
7
8
9
10
|
#/bin/bash
echo
"please enter two number"
read a
read b
if
test $a -eq $b
then echo
"NO.1 = NO.2"
elif test $a -gt $b
then echo
"NO.1 > NO.2"
else
echo
"NO.1 < NO.2"
fi
|
<2>运行【找到脚本路径,用source命令执行它】
3、Web单元测试
<1>大部分条件下,我们开发的时候,都会做一些简单的单元测试,常见的就是java的JUnit测试框架了。如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
public
class
TestBlog
extends
JFinalModelCase {
public
static
Logger logger = Logger.getLogger(TestBlog.
class
);
@Ignore
@Test
public
void
testJson() {
String columns = BlogConst.CONTENT + Const.SYMBOLCOMMA
+ BlogConst.TITLE;
Blog blog = Blog.dao.findById(
1
, columns);
ControllerCommon.errorMsg(
"执行"
);
JFinalTestUtil.print(JsonKit.toJson(ControllerCommon.ctrCommon
.returnJsonToClient(blog)));
}
@Test
public
void
testFindFirst() {
Blog blog = Blog.dao.getLastInsertBlog();
logger.info(blog.getInt(
"id"
));
}
@Ignore
@Test
public
void
testFind() {
Blog blog = BlogService.blogService.findBlogById(
1
);
logger.info(blog);
}
}
|
<2> 当我们把代码部署到测试服务器上后(一般都是linux服务器),怎么满足我们的单元测试?有没有一个通用的工具可以直接通过命令来执行一些单元测试用例。OK,终于说到了正题上面,下面我们就开始吧!
4、Shell工具
<1> 下面这几行代码就可以实现了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
#!/bin/bash
#引入java环境变量,如果配置在用户环境变量下就自行修改
. /etc/profile
#获取执行shell给的参数
PRG=
"${1}"
echo $PRG
#输入包名称,类名称
echo
"please input packageName , ClassName"
read packageName
read className
#取得当前.sh文件所在的目录
#DIR=
"$( cd "
$( dirname
"${BASH_SOURCE[0]}"
)
" && pwd )"
DIR=
"/home/tian/Downloads/tomcat/apache-tomcat-7.0.59/webapps/Jfinal/WEB-INF"
#日志文件的路径
LOG_DIR=
"/home/tian/Desktop"
#引入
class
所在的文件夹
classes=$DIR/classes
#lib folder
libs=$DIR/lib/*
#将classes和包jar加入classpath,注意用的是冒号
":"
分割的
classpath=$classes:$libs
# java -classpath $classpath 主函数类入口 #>>
"$PRG"
com.demo.jfinal.JFinalModelCase.java
java -classpath $classpath $packageName.$className
"$PRG"
>>
"$LOG_DIR/javalog.txt"
echo
"shell over.."
|
解读:脚本支持3个参数;参数1:要执行的单元测试的方法;参数2:要执行单元测试的包;参数3:要执行的单元测试的类
<2> 那么如何使用它呢?请看!这也是这个脚本的功能点1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
/**
* Unit test for simple App.
*/
public
class
TestBlog
extends
JFinalModelCase {
public
static
Logger logger = Logger.getLogger(TestBlog.
class
);
@Ignore
@Test
public
void
testJson() {
String columns = BlogConst.CONTENT + Const.SYMBOLCOMMA
+ BlogConst.TITLE;
Blog blog = Blog.dao.findById(
1
, columns);
ControllerCommon.errorMsg(
"执行"
);
JFinalTestUtil.print(JsonKit.toJson(ControllerCommon.ctrCommon
.returnJsonToClient(blog)));
}
@Test
public
void
testFindFirst() {
Blog blog = Blog.dao.getLastInsertBlog();
logger.info(blog.getInt(
"id"
));
}
@Ignore
@Test
public
void
testFind() {
Blog blog = BlogService.blogService.findBlogById(
1
);
logger.info(blog);
}
public
static
void
main(String[] args) {
String methodExecute =
""
;
if
(args.length ==
0
) {
logger.info(
"无参数"
);
return
;
}
else
{
methodExecute = args[
0
];
logger.info(
"args[0]:"
+ args[
0
]);
}
logger.info(
"==================Method Begin:"
+
"=================="
);
Result result =
new
JUnitCore().run(Request.method(TestBlog.
class
,methodExecute));
for
(Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
logger.info(
"===================Result: "
+ result.wasSuccessful() +
"=================="
);
}
}
|
<3> 找到当前脚本路径,执行它
<4> OK,让我们看一下日志文件【看脚本代码知晓:javalog.txt】
1
2
3
4
5
6
7
|
2015
-
12
-
25
12
:
18
:
09
:
619
[INFO]: args[
0
]:testFindFirst
2015
-
12
-
25
12
:
18
:
10
:
237
[INFO]: ==================Method Begin:==================
2015
-
12
-
25
12
:
18
:
10
:
716
[INFO]: {dataSource-
1
} inited
Sql: select * from blog order by id desc
2015
-
12
-
25
12
:
18
:
11
:
004
[INFO]:
8
2015
-
12
-
25
12
:
18
:
11
:
039
[INFO]: {dataSource-
1
} closed
2015
-
12
-
25
12
:
18
:
11
:
072
[INFO]: ===================Result:
true
==================
|
<5>那么如何使用它呢?请看!这也是这个脚本的功能点2, TestBlog.java类如上
TestJunit.java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
public
class
TestJunit {
public
static
Logger logger = Logger.getLogger(TestJunit.
class
);
public
static
void
main(String[] args) {
logger.info(
"==================Method Begin"
+
"=================="
);
Result result = JUnitCore.runClasses(TestBlog.
class
);
for
(Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
logger.info(
"===================Result: "
+ result.wasSuccessful() +
"=================="
);
}
}
|
<6> 找到当前脚本路径,执行它
解读:这里只需要两个参数就够了,功能是执行TestBlog类的所有@Test方法,排除@Ignore
<7> 再来看看我们的日志文件,多了一条测试记录
1
2
3
4
5
6
7
8
9
10
11
12
13
|
2015
-
12
-
25
12
:
18
:
09
:
619
[INFO]: args[
0
]:testFindFirst
2015
-
12
-
25
12
:
18
:
10
:
237
[INFO]: ==================Method Begin:==================
2015
-
12
-
25
12
:
18
:
10
:
716
[INFO]: {dataSource-
1
} inited
Sql: select * from blog order by id desc
2015
-
12
-
25
12
:
18
:
11
:
004
[INFO]:
8
2015
-
12
-
25
12
:
18
:
11
:
039
[INFO]: {dataSource-
1
} closed
2015
-
12
-
25
12
:
18
:
11
:
072
[INFO]: ===================Result:
true
==================
2015
-
12
-
25
12
:
28
:
56
:
377
[INFO]: ==================Method Begin:tdd==================
2015
-
12
-
25
12
:
28
:
56
:
994
[INFO]: {dataSource-
1
} inited
Sql: select * from blog order by id desc
2015
-
12
-
25
12
:
28
:
57
:
232
[INFO]:
8
2015
-
12
-
25
12
:
28
:
57
:
266
[INFO]: {dataSource-
1
} closed
2015
-
12
-
25
12
:
28
:
57
:
299
[INFO]: ===================Result:
true
==================
|
5、Shell:
1、语法和结构通常比较简单。
2、学习和使用通常比较简单。
3、通常以容易修改程序的"解释"作为运行方式,而不需要"编译"。
4、程序的开发产能优于运行效能。
5、Shell脚本语言是Linux/UNIX 系统上应用广泛的实用程序设计语言,它是"易学难精"的,真正学会Shell 脚本编程,需要读者清晰地掌握Linux 重要命令的语法,理解Linux 命令重要选项的作业和区别,还需要掌握Shell 脚本语言的语法结构以及一些常用的小工具。