学习笔记
环境搭建
- jdk
rpm -ivh jdk #安装JDK
rpm -e #删除
vi /etc/profile #修改JDK环境变量
JAVA_HOME=/usr/java/jdk1.8.0_11
JRE_HOME=$JAVA_HOME/jre
CLASS_PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib
PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export PATH CLASS_PATH JAVA_HOME JRE_HOME
source /etc/profile #刷新环境变量配置
-
MySQL
-
yum安装
-
rpm安装
- 挂载光盘
# 通过ls显示/dev目录下的列表,然后通过管道符过滤 ls -l /dev | grep cdrom #找到光盘完整路径名 mount /dev/cdrom /mnt/cdrom #将光盘挂载到/mnt/cdrom
-
安装
rpm -ivh xxx
-
-
Tomcat
-
MySQL配置登录名权限
use mysql;
update user set host='%' where host='localhost'
Linux
文件
#切换到家目录
cd
cd ~
cd /root
cd /home/spj
df -h # 查看磁盘空间使用情况
history #查看历史命令
!518 #518位历史命令编号,此命令可以执行编号对应的历史命令
touch 新建文件.txt # 创建文件
wc profile # 查看profile文件的 行数 文字总数 字符数 文件名
cat -n file # 查看文件,显示行号不忽略空行
head -5 file # 查看文件,前5行
vi file
gg # 跳转到第一行
G # 跳转到最后一行
nG # 跳转到第n行
/文本 # 查找 按n切换
:%s文本1/文本2/g # 替换 加/g的话会全局替换,不加的话只替换每行的第一个匹配到的字符串
u #撤销
# 查找文件
find -name # 按照文件名查找
-size # 按照文件大小查找 +number 表示大于 -number 表示小于
-perm # 按照文件权限查找 例如: find -perm 755
-user # 按照文件属主查找文件
-group # 按照文件所属的组查找文件
-mtime -n +n # 按照文件的更改时间来查找,-n表示文件更改时间在n天以内,+n表示文件更改时间在n天以外
-type # 查找某一类型的文件
# find多条件组合
-a # 与
-o # 或
-not # 非
用户
uid | gid | groups |
---|---|---|
用户ID | 组ID | 所属组集合 |
#用户
useradd #添加用户[-g 组ID(将用户添加到特定的组)]
passwd 用户名 #设置密码
usermod -g 组 用户名 #编辑用户
userdel -r 用户名 #删除用户的同时把该用户的家目录删除
userdel 用户名 #删除用户,但是不删除家目录
id 用户名 # 查看用户的用户ID、组ID、所属组集合
tail /etc/passwd
test:x:501:501::/home/test:/bin/bash
用户名:x:用户ID:组ID:昵称:家目录:shell类型
tail /etc/shadow
test:!!:18206:0:99999:7:::
用户名:密码: #当用户没有设定密码时,密码显示为!!
#用户组
groupadd 组名 # 创建组
groupmod
groupdel 组名 # 删除用户组
tail /etc/gshadow # 查看用户组信息
权限
chmod u+x 文件名 #改变读写权限 [u][g][o][a]用户 组 其他人 所有 [r][w][x]读写可执行
chown 用户:用户组 # 改变用户,用户组
chgrp 用户组 # 改变用户组
打包
zip -c 源文件 > 目标文件 # 压缩
unzip 源文件 -d 指定目录 # 解压 [d] 指定目录
gzip -c 源文件 > 目标文件 # 压缩,源文件存在
gzip 源文件 > 目标文件 # 压缩,源文件不存在
gunzip 源文件 # 解压
gzip -d 源文件 # 解压
tar -cvf 目标文件 源文件 #打包文件
tar -zcvf 目标文件 源文件 #打包文件,在打包同时进行压缩 [C]指定目录
tar -xvf 源文件 #解包
tar -zxvf 源文件 #解包
连接
# 软连接
ln -s 源文件 目标文件
测试用例设计
随机测试存在的问题
- 不知道是否全名的测试了所有功能,测试的覆盖率无法衡量。
- 对新版本的重复测试很难实施。
- 无法对测试质量进行有效评估。
- 无法形成有效的知识积累。
测试用例的概念
比较预期结果与实际结果是否一致
测试用例可以作为新手测试指南,也可以作为测试日志。
属性与特征
CMNI工具
用例编号 | 用例标题 | 操作步骤 | 预期结果 | 实际结果 | 测试结论 |
---|---|---|---|---|---|
测试结论:OK (通过) NG (不通过) NA (阻塞)
实际结果
bug信息(bug ID)
测试数据
Excel技巧
Ctrl+; 插入当前日期
=ROW()-1 当前行-1
设计原则
设计用例原则
- 测试用例对需求覆盖的完整性
- 测试用例的有效性
- 测试用例的可理解性
- 测试用例的清晰性
- 测试用例的可维护性
冒烟测试:测试基础功能,周边功能先不测
设计方法
- 等价类
- 边界值
等价类方法
边界值分析法
判定表法
- 条件桩:判定的所有条件
- 动作桩:根据条件作出的动作
通过测试:测试系统实现了需求说明书中存在的功能,确定程序是否满足目标。
失败测试:蓄意攻击软件的薄弱环节,证明一个系统不做不需要它做的事情。
在实际的测试工作中可以按照以下原则运用测试技术:
- 在任何情况下都必须使用边界值分析方法。
- 用等价类划分法补充一些测试用例。
- 用错误推测法增加一些测试用例。
- 如果程序功能说明中含有输入条件的组合,应该在一开始就选择用因果图法。
- 如果程序的某功能适合自动测试,则可采用自动测试方法以及随机测试方法进行测试。
数据库
登录
sqlplus -- 登录
alter user scott account unlock; -- 解锁用户
conn -- 切换用户
scott/tiger@orcl -- 使用scott用户登录
alter user scott identified by tiger -- 使用管理员用户把scott用户的密码修改
-- 创建用户
create user 用户名 identified by tiger
scott/tiger@orcl
空值
任何值和空值做算数运算返回的结果都是空值。
nvl(参数1,参数2)
若参数1不为空,返回参数1
若参数为空,返回参数2
select * from 表名 where 字段名 is null -- 查询字段为空
select * from 表名 where 字段名 is null -- 查询字段不为空
强制修改列名显示
给自定义列名加双引号
连接符
|| 将两项结果拼接到一列显示(拼接字符串)
虚拟表
DUAL是一张虚拟表
select 字段 distinct from 表名 -- 去重
select sysdate from dual; -- 获取当前系统时间
oracle下所有表挂靠在用户名下
select tname from tab; -- 查找当前用户有哪几张表
数据类型
number(5) 最大长度为5位
number(7,2) 最大长度为7位,其中有两位小数
基础函数
to_date(‘2019-11-08 14:56:00’,‘yyyy-mm-dd hh:mi:ss’); 将字符串按指定格式转换为时间
to_char(sysdate,‘yyyy-mm-dd hh:mi:ss’) 将当前时间转化为指定格式字符串
分页
-- 实现一
select
*
from(
select emp.*,rownum rn from emp where rownum <= 10
) t
where
t.rn >= 5
-- 实现二
select
*
from(
select emp.*,rownum rn from emp
) t
where t.rn >=5 and t.rn <= 10
-- 实现三
select
*
from(
select emp.*,rownum rn from emp
) t
where t.rn between 5 and 10
测试题
-- 1、查询emp表,显示薪水大于2000,且工作类别是MANAGER的雇员信息
select * from emp where sal > 2000 and job = 'MANAGER'
-- 2、查询emp表,显示年薪大于30000,工作类别不是MANAGER的雇员信息
select * from emp where (sal+nvl(comm,0))*12 > 30000 and job != 'MANAGER'
-- 3、查询emp表,显示薪水在1500到3000之间,工作类别以“M”开头的雇员信息
select * from emp where (job like 'M%') and (sal between 1500 and 3000)
-- 4、查询emp表,显示佣金为空且部门号为20或30的雇员信息
select * from emp where comm is null and deptno in (20,30)
-- 5、查询emp表,显示佣金不为空或部门号为20的雇员信息,按照薪水降薪排序
select * from emp where (comm is not null) or deptno = 20 order by sal desc
-- 6、查询emp表,显示年薪大于30000,工作类别不是MANAGER,且部门号不为10或40的雇员信息,要求按雇员姓名进行排序
select * from emp where ((sal+nvl(comm,0))*12 > 30000 and job != 'MANAGER') and deptno not in(10,40) order by ename
单组函数
函数名 | 功能 |
---|---|
upper(str) | 将小写转化为大写 |
lower(str) | 将大写转化为小写 |
initcap(str) | 首字母大写 |
length(str) | 获取字符串的长度 |
nvl(em1,em2) | 非空判断,若em1为空返回em2,否则返回em1 |
nvl2(em1,em2,em3) | 非空判断,若em1为空返回em3,否则返回em2 |
replace(str,str1,str2) | 将str中的str1替换为str2 |
substr(str,pos,[length]) | 返回从pos位开始截取str,截取length位后的字符串 |
floor(dou) | 向下取整 |
mod(num1,num2) | 取余,返回num1除num2后的余数 |
round(num1,num2) | 四舍五入,精确到小数点后num2位,num2默认是0 |
trunc(num1,num2) | 只舍不如,精确到小数点后num2位,num2默认是0 |
add_months(date,num) | 返回date时间在num月后的时间 |
last_day(date) | 返回输入时间的当前月最后一天 |
next_day(date,‘星期六’) | 返回距离输入时间最近的星期六 |
months_between(lastdate,fristdate) | 返回输入两个时间相隔的月数 |
转换函数
函数 | 功能 |
---|---|
to_date(str,form) | 将字符串按form格式转为日期 |
to_char(date,form) | 将输入时间按form格式转为字符串 |
to_number(str) | 将字符串转为数字 |
分支函数
函数 | 功能 |
---|---|
decode(字段,条件1,实现1,条件2,实现2,默认实现) | 判断字段,如果条件1符合就执行实现1,依次类推 |
case 字段 when 条件1 then 实现1 else 默认实现 end | 字段判断字段,如果条件1符合就执行实现1,依次类推 |
举例:
select decode(deptno,10,sal*1.5,20,sal*2,sal) from emp;
select job,sal,
case job
when 'SALESMAN' then sal+300
when 'ANALYST' then sal+500
else sal
end
from emp;
分组函数(聚合函数)
函数 | 功能 |
---|---|
sum() | 求和 |
avg() | 求平均 |
max() | 求最大值 |
min() | 求最小值 |
count() | 求数量 |
00937:聚合函数不能与普通列同时检索,否则会报出 00937 的错误。除非有group by
00979:检索字段不在group by分组条件中
00934:where中不可以有分组,可以用having代替where做限制条件
group by可以提供多个分组条件,每个分组条件以","分隔。与order by的用法类似。
多表连接
select dname from emp,dept where emp.deptno = dept.deptno and ename='SCOTT';
select dname from emp join dept on emp.deptno = dept.deptno where ename='SCOTT';
-- 在join on的on中可以使用and来做多个条件判断
select dname from emp join dept on emp.deptno = dept.deptno and ename='SCOTT';
-- 需要两表之间有同名字段
select dname from emp join dept using(deptno) where ename='SCOTT';
-- 需要两表之间有同名字段
select dname from emp natural join dept where ename='SCOTT';
举例:
-- 在join on的on中可以使用and来做多个条件判断
select
emp.sal,salgrade.grade
from emp
join salgrade on emp.sal >= salgrade.losal and emp.sal <= salgrade.hisal;
select
emp.sal,salgrade.grade
from emp
join salgrade on emp.sal between salgrade.losal and salgrade.hisal;
-- 自连接
select t1.ename,t2.ename
from emp t1
join emp t2
on t1.mgr = t2.empno;
子查询
-- 单行子查询
select *
from emp
where deptno = (select deptno from emp where ename = 'SCOTT')
and ename = 'SCOTT'
-- 多行子查询
in (结果集) -- 适用于等值比较
any (结果集) -- 比较结果集返回的每一个结果,符合其中任意一个条件就返回true
all (结果集) -- 比较结果集返回的每一个结果,符合其中全部条件就返回true
rownum只能用在比较<,<=时
集合运算符
union | 并集 |
intersect | 交集 |
minus | 差集 |
数据类型
number 可指定长度,默认38
int 22位整数
char 定长字符串 5位
varchar2 可变长字符串
date 日期类型
DML
可以回滚
create table emp2 as select * from emp
insert into tab2 select * from tab1
update tab2
set (feil1,feil2) = (
select feil1,feil2 from tab1
)
rollback -- 回滚
commit -- 提交
DDL
不可以回滚,执行后立即生效
创建表
create table tab1 (
id number(2),
name varchar2(10)
)
create table tab2 as select * from tab1
修改表
-- 添加列
alter table tab add (feil1 type1,feil2 type2)
-- 删除列
alter table tab drop column feil;
alter table tab drop (feil1,feil2);
-- 编辑列
alter table tab modify feil type;
-- 修改列名
alter table tab rename column feilname1 to feilname2
-- 修改表名
rename tabname1 to tabname2
alter table tabname1 rename to tabname2
-- 清空表中数据
truncate table tab
删除表
- 从Oracle10g开始,删除数据库表的时候并不是真正删除,而是放到了recyclebin中,这个过程类似Windows中删除的文件放在回收站
- 通过show recyclebin可以查看被删掉的表的详细信息,或者查询 select * from recyclebin;/select * from user_recyclebin;
- 回收表的命令:flashback table 原表名 to before drop;
- 清空回收站:purge recyclebin;
- 删除表时不经过recyclebin:drop table 表名 purge;
-- 将表放入回收站
drop table tab;
-- 强制删除
drop table tab purge;
-- 查看回收站
select * from user_recyclebin;
-- 回收表
flashback table tab to before drop;
-- 清空回收站
purge recyclebin;
约束
Oracle有如下类型约束:
- not null
- unique key
- primary key
- foreign key
- check
-- 查看约束
select * from user_constraints where table_name = 'tab'
-- 删除约束
alter table tab drop constraint 约束名
-- 使约束失效
alter table tab disable constraint 约束名
-- 使约束生效
alter table tab enable constraint 约束名
涉及到单列的是列级约束
涉及到多列的是表级约束
主键
非空约束、唯一约束
-- 添加主键
-- 1、创建表时添加主键
create table tab (
feil type primary key
)
-- 2、创建表后添加主键
alter table tab add primary key (feil)
alter table tab add constraint 主键名 primary key (feil) -- 指定名字
-- 删除主键
alter table tab drop primary key cascade;
外键
一张表的外键必须是另一张表的主键
在向外键所在列插入值时,该值必须在另一张表中能找到对应的值
-- 添加外键
-- 普通外键约束
alter table tab
add constraint 外键名 foreign key (主表字段)
references 外键表(外键表字段,该字段是外键表的主键)
-- 级联外键约束
alter table tab
add constraint 外键名 foreign key (主表字段)
references 外键表(外键表字段,该字段是外键表的主键) on delete cascade
-- 置空外键约束
alter table tab
add constraint 外键名 foreign key (主表字段)
references 外键表(外键表字段,该字段是外键表的主键) on delete set null
非空
-- 添加非空约束
alter table tab modify feil not null
-- 添加唯一约束
alter table tab modify feil unique
视图
view
一段查询的快捷方式
修改视图中的数据,原表的数据也会改变
为了保护表结构不被发现,也可以保护表中的数据。同时也简化了查询的语句。
-- 创建视图
create view view1 as select * from tab
-- 创建或替换视图
create or replace view
as
select * from tab
where xxxxx with check option -- 限制跟新,不能修改where中所用的条件的数据
-- 使用视图
select * from view1
with check option
with read only
-- 使用聚合函数做出的视图默认是只读的
索引
-- 创建索引
create index indexName on tab(feil)
权限
-- 赋予用户创建视图权限
grant create view to 用户名
grant create any view to 用户名
-- 回收用户创建视图权限
revoke create view from 用户名
revoke create any view from 用户名
grant -- 赋权
revoke -- 回收权限
-- 赋予会话权限
grant create sessin to 用户名
-- 赋予连接者角色
grant connect to 用户名
-- 赋予资源管理者权限(可操作表)
grant resource to 用户名
-- 赋予user2查看user1的tabName表的权限
grant select on user1.tabName to user2
insert
update
delete
all
-- 系统权限传递
grant resource to userName with admin option
-- 对象权限传递
grant select on user1.tab to user2 with grant option
connect -- 连接者
resource -- 资源者
当系统权限放权给第三方后,第二方权限被回收后,第三方不受影响