overleaf 生成的文档无法被维普等查重网站识别 / Latex 文档引用为问号

一句话解决:

安装本地 Latex 环境,并本地编译。如果引用(upcite)方括号里面是问号,那就再敲一次编译命令。

故事背景

热心群众小金给了在下一个 Latex 模板,然后给我推荐了 overleaf 这个在线写 Latex 的网站。一路用得很 high,排版是真的非常 elegant ,体验比 Word 不知道高到哪里去。当我愉快地完成论文写作,用 overleaf 编译了 pdf 准备去查重的时候,发现 维普 和 paperpass 这两个网站都没办法读入我的 pdf 文件:维普不能看到读入了什么,但是指出我的文章只有1000+字符,只收我 6 块钱;paperpass 可以看见 pdf 解析之后是一堆乱码。只有 paperyy 这个查重平台可以认出我的 pdf 内容(并且这个还是免费查重,比较适合初稿查重)

系统环境

文档用的 xelatex 编译器,tex 文件使用 UTF-8 编码,图片使用 PNG 格式。使用 ctex 中文包,导入时如下:

\usepackage{ctexcap}

本地编译操作系统为 MacOS Majave,xelatex 编译器版本信息如下:

XeTeX 3.14159265-2.6-0.99999 (TeX Live 2018)
kpathsea version 6.3.0
Copyright 2018 SIL International, Jonathan Kew and Khaled Hosny.
There is NO warranty.  Redistribution of this software is
covered by the terms of both the XeTeX copyright and
the Lesser GNU General Public License.
For more information about these matters, see the file
named COPYING and the XeTeX source.
Primary author of XeTeX: Jonathan Kew.
Compiled with ICU version 61.1; using 61.1
Compiled with zlib version 1.2.11; using 1.2.11
Compiled with FreeType2 version 2.9.0; using 2.9.0
Compiled with Graphite2 version 1.3.11; using 1.3.11
Compiled with HarfBuzz version 1.7.6; using 1.7.6
Compiled with libpng version 1.6.34; using 1.6.34
Compiled with poppler version 0.63.0
Using Mac OS X Core Text and Cocoa frameworks
解决方法:

用本地编译,用本地编译,用本地编译

在我准备用 Word 重新排版论文的时候,我就想,不如死马当活马医,本地编译再提交看看。一开始我没有抱有什么希望,直觉上觉得,不同地方编译出来的 pdf 应该是一样的。于是我就试了试用本地编译,用的命令如下:

xelatex tex.tex

其实我对本地命令行用 Latex 算是一窍不通,于是没有加什么参数(也不知道有什么参数)。连这条命令都是靠直觉蒙中的。

打完命令后,他给我刷刷刷了几个屏幕的信息,然后说,生成好了。对比发现实际生成的东西并不一样,字体变了,然后发现引用框框里面都是问号。然后查来查去,国内博客互相抄来抄去都是说 xx 的 IDE 上面怎么样操作,不过还好最后在歪果论坛的深处,有人说,再打一遍命令就好了。于是我就:

xelatex tex.tex
xelatex tex.tex

后面一次生成的 pdf 会自动覆盖前一次的。当他刷刷刷了一大串东东之后,pdf 就生成好了。然后丢给维普,维普正常认出来了(然后收了我50多块钱),paperpass导入也正常了。

至此,Latex 的查重问题基本解决了。

 

[编程题]贪吃的小Q-算法题记录

前几天隔壁宿舍同学在刷算法题,串门的时候看到了这道有趣的题,记录一下。 原题目是这样的: 链接:https://www.nowcoder.com/questionTerminal/d732267e73ce4918b61d9e3d0ddd9182?orderByHotValue=1&page=1&onlyReference=false 来源:牛客网 小Q的父母要出差N天,走之前给小Q留下了M块巧克力。小Q决定每天吃的巧克力数量不少于前一天吃的一半,但是他又不想在父母回来之前的某一天没有巧克力吃,请问他第一天最多能吃多少块巧克力

输入描述:
每个输入包含一个测试用例。
每个测试用例的第一行包含两个正整数,表示父母出差的天数N(N<=50000)和巧克力的数量M(N<=M<=100000)。
输出描述:
输出一个数表示小Q第一天最多能吃多少块巧克力。
示例1

输入

3 7

输出

4

一开始打算找规律,使用2的n次方进行分配,最后也没有得出一个好的解法(虽然已经很接近了),于是看了一下牛客的参考答案,主要是两种解法:

二分查找法:

非常暴力的方法,意料之外情理之中。需要的结果为“第一天最多可以吃多少个”,这个值一定在0与巧克力总数M之间。于是可以在[0,M]区间内进行二分查找。复杂度为O(logM·N),代码如下:

//@小冲冲

#include
using namespace std;
int n,m;
//计算第一天吃s个巧克力一共需要多少个多少个巧克力
int sum(int s){
    int sum=0;
    for(int i=0;i<n;i++){ sum+=s; s=(s+1)>>1;//向上取整
    }
    return sum;
}
//二分查找
int fun(){
    if(n==1) return m;
    int low=1;
    int high=m;//第一天的巧克力一定是大于等于1小于等于m的
    while(low<high){ int mid=(low+high+1)>>1;//向上取整
        if(sum(mid)==m) return mid;//如果第一天吃mid个巧克力,刚刚好吃完所有巧克力,那么直接返回
        else if(sum(mid)<m){ low=mid; }else{ high=mid-1; } } return high; } int main() { cin>>n>>m;
    int res=fun();
    cout<<res<<endl;
    return 0;
}

但是我个人觉得这个想法不太elegant,复杂度仍有一些高,于是再往下翻,找到一个比较有意思的解法,跟我一开始的想法差不多。他没有标明他的方法,我给他随便起个名字:

逐次分配法:

他的思路如下:

  1. 首先,每天分配一颗巧克力
  2. 计算得到剩余的可分配巧克力
  3. 按照2的N次方的顺序给各天分配,如:可分配的有7颗,则第一天分4个,第二天分2个,第三天分1个。
  4. 计算剩余的巧克力数量,如果还有剩余,跳转到2
  5. 没有剩余可分的巧克力,则完成分配。

代码如下:

//@域外創音
#include
#define MAX_INDEX 17
int power2[] = {1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072};
int main()
{
    int n,m;
    std::cin>>n>>m;
    //只有1天时直接输出
    if(n==1){std::cout<<m<<std::endl;return 0;} //初始分配:每天最少吃1块     
    int alignable = m-n; 
    int result = 1; //如果可以某种power2[i]-1的方式分配,便进入。具体的分配是:第一天多吃power2[i-1]块,第二天多吃power2[i-2]块,依此类推。 
    //这样一来,只要每个追加分配所对应的i不重复,每天吃的块数就依然能符合要求,因为第j天吃的块数最多等于power2[从i-j到0]+1,一定大于power2[从i-j-1到0]的二倍。 
    for(int i=MAX_INDEX-1;i>=0;i--)if(alignable>=power2[i]-1)
    {
        result+=power2[i-1];
        alignable -= (power2[i]-1);
    }
    std::cout<<result<<std::endl;
    return 0;
}

这个代码非常的有意思,它可以把复杂度减少到O(log(m)),并且它还通过了所有测试用例。但是,作为预备役测试猿,我找到了它一个bug(笑)。当输入用例为(3天,20块巧克力)时,跑出来的结果是10,但是实际上,可以得到(11,6,3)的分配策略,与其得到的结果不符。使用二分查找法得出的结果也为11.问题出在哪里呢,通过代码走读很容易定位到问题出在18行:

alignable -= (power2[i]-1);

以(3天,20块)为用例,逐步推演,即可看到问题是怎么样发生的:

 

在第一轮分配的时候,@域外創音 的方法是,默认认为分配了pow(2,n)-1颗,而不是实际分出去的颗数。在此用例中,假如有4天或以上,分配列为(8,4,2,1),alignable -= 15无疑是正确的,但是当只有3天时,则会给不存在的第四天分配了一颗,从而导致最终结果的错误。

更正的方法也很简单,就是把alignable -= (power2[i]-1);改为alignable -= actually_assigned即可,而actually_assigned值的计算可以由代码中的i与天数n联合得出。

经过修改的代码如下,通过了牛客网的OJ所有测试用例,暂未发现未通过的其它反例。

#include<iostream>
#define MAX_INDEX 17
int power2[] = {1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072};
int main()
{
    int n,m;
    std::cin>>n>>m;
    //只有1天时直接输出
    if(n==1){std::cout<<m<<std::endl;return 0;} //初始分配:每天最少吃1块
    int alignable = m-n;
    int result = 1; //如果可以某种power2[i]-1的方式分配,便进入。具体的分配是:第一天多吃power2[i-1]块,第二天多吃power2[i-2]块,依此类推。
    //这样一来,只要每个追加分配所对应的i不重复,每天吃的块数就依然能符合要求,因为第j天吃的块数最多等于power2[从i-j到0]+1,一定大于power2[从i-j-1到0]的二倍。
    for(int i=MAX_INDEX-1;i>=0;i--)if(alignable>=power2[i]-1)
        {
            if(i>0)//防止越界
                result+=power2[i-1];
            int assigned = 0;
            if(i>n)
                assigned = (power2[i]-1) - (power2[i-n]-1);
            else
                assigned = (power2[i]-1);
            alignable -= assigned;
        }
    std::cout<<result<<std::endl;
    return 0;
}

 

Tokens in Python

本文主要归纳python的parse过程中,词法分析中,生成的Token的名字以及其含义。
此文章归纳自https://github.com/python/cpython/blob/3.6/Parser/tokenizer.c,版本为python3.6。

 

ENDMARKER, 结束标记符
NAME, 名字
NUMBER, 数字
STRING, 字符串
NEWLINE, 换行
INDENT, 缩进
DEDENT, 未明,在tokenizer.c里面找不到
LPAR, 左括号(
RPAR, 右括号)
LSQB, 左中括号[
RSQB, 右中括号]
COLON, 冒号:
COMMA, 逗号,
SEMI, 分号;
PLUS, 加号+
MINUS, 减号-
STAR, 星号*
SLASH, 斜杠/
VBAR, 或号|
AMPER, 与&
LESS, 小于号<
GREATER, 大于号>
EQUAL, 等于号=
DOT, 点.
PERCENT, 百分号%
LBRACE, 左花括号{
RBRACE, 右花括号}
EQEQUAL, 判断相等==
NOTEQUAL, 不相等!=或者<>
LESSEQUAL, 小于等于<=
GREATEREQUAL, 大于等于>=
TILDE, 波浪线~
CIRCUMFLEX, 音调符号^
LEFTSHIFT, 左移<<
RIGHTSHIFT, 右移>>
DOUBLESTAR, 双星号**
PLUSEQUAL, 加等于+=
MINEQUAL, 减等于
STAREQUAL, 星等于*=
SLASHEQUAL, 除等于/=
PERCENTEQUAL, 百分号等于%=
AMPEREQUAL, 与等于&=
VBAREQUAL, 或等于|=
CIRCUMFLEXEQUAL, 次等于^=
LEFTSHIFTEQUAL, 左移等于<<=
RIGHTSHIFTEQUAL, 右移等于>>=
DOUBLESTAREQUAL, 双星号等于**=
DOUBLESLASH, 双斜杠//
DOUBLESLASHEQUAL, 双斜杠等于//=
AT, AT号@
ATEQUAL, @=
RARROW, ->
ELLIPSIS, 省略号…
/* This table must match the #defines in token.h! */
OP,
AWAIT, 关键字await
ASYNC, 关键字async
<ERRORTOKEN>, 错误的token
<N_TOKENS> 不知道是啥

使用python撸一个支持四则运算的计算器

代码地址:https://github.com/MakDon/toy_calculator
效果如下:


实现的功能为读入一个字符串格式的算式,然后输出数字格式的结果。

计算器主要包括如下几个部分:

  1. 词法分析器
  2. 语法分析器
  3. 伪指令生成器
  4. 伪VM

词法分析器

词法分析器对输入的文本进行分析,输出为一串token。如输入为

"1 + 2 + 3 + 5 + 7"

则输出为:

<class 'list'>:
 [['NUMBER', '1'], ['+', '+'], ['NUMBER', '2'], ['+', '+'], 
['NUMBER', '3'], ['+','+'], ['NUMBER', '5'], ['+', '+'], ['NUMBER', '7']]

此处实现的基本思路是,使用正则对字符串从头进行匹配,若匹配到结果,则截取为一个token,然后继续匹配;若一直匹配不到结果,则认为输入的串存在词法错误。使用的正则分别如下:

 {
    "NUMBER": r"([0-9]+\.)?[0-9]+",# 数字
    "+": r"\+",# 加号
    "-": r"-",# 减号
    "*": r"\*",# 乘号
    "/": r"/",# 除号
    "LBRA": r"\(",# 左括号
    "RBRA": r"\)",# 右括号
    "SEPARATOR": r"( |\n)"# 分隔符,此处使用空格与换行
}

 

语法分析器:

语法分析,是把词法分析器生成的token串,转换为抽象语法树(Abstract Syntax Tree,AST)。上节的token串生成的AST如下:

在此计算器中,我选择的是自顶向下的生成方式。四则运算语法如下:

Expr      ->    Term ExprTail
ExprTail  ->    + Term ExprTail
          |     - Term ExprTail
          |     null

Term      ->    Factor TermTail
TermTail  ->    * Factor TermTail
          |     / Factor TermTail
          |     null

Factor    ->    (Expr)
          |     num

reference:https://zhuanlan.zhihu.com/p/24035780

其中各个符号的含义与消除左递归的推导过程详见《编译原理》。

伪指令生成

上一节的语法分析器中,生成得到了AST。这一步的作用,则是把上一节得到的树,转化为顺序的指令序列。此处使用了递归的深度遍历的方法,此处生成的每条指令包括如下两个部分:

  1. 操作:操作可以为入栈,或者是运算(加减乘除)。
  2. 操作数:可选,当操作为入栈时,操作数是被入栈的数值。当操作为运算时为None。

上一节的AST可以生成如下指令:

[(PUSH,1), (PUSH,2), (+,None), (PUSH,3), (+,None), (PUSH,5), (+,None), (PUSH,7), (+,None)]

 

伪VM

伪VM的作用,为自行上一节生成的伪指令,最后返回结算的结果。伪VM维护一个栈,用于数值计算。获得指令序列后,开始顺序执行指令。当指令的操作为入栈时,把指令的操作数push入栈顶。当指令为运算时,pop出栈顶的两个数字,进行指令的运算,然后把运算结果push回栈顶。在指令序列执行完后,伪VM的栈内应有且只有一个数值,为计算结果。

在伪VM执行完指令后,就得到结果了,计算的全过程也就此结束了。

Windows To Go 接入parallel desktop后应用打开无反应

现象:双击exe文件后,可以在任务管理器看见进程被创建,但是随即消失,不能正常打开应用。系统内置软件则可以正常打开

解决方法:在系统设置的应用内,卸载parallel desktop tool

事件回顾:

之前在外置SSD内安装了一个Windows To Go,在需要的时候连接MacBook重启切换系统。在前几天,需要同时用到两个系统,于是想办法在parallel desktop内把这个系统跑起来。

当插着SSD的时候在parallel desktop内新建,可以识别出外置硬盘内装有bootcamp,但是在由bootcamp新建时,提示一个文件没有读写权限。在Google后发现Windows To Go大多数人并不是这样添加进去而是采用另一种办法:

正常新建一个Windows10的虚拟机,在选择安装源的时候选择无安装源,然后在虚拟机的启动设置内,把第一驱动顺序设置为外置SSD。我按照此方法在PD12上正常跑起来了Windows To Go,在安装了parallel desktop tool之后与原生的虚拟机无太大差别。(但是硬盘的IO速度极慢,而且在刚刚创建进桌面的时候等待时间极长)

然鹅当我想把这个SSD当做正常的Windows To Go来用的时候(即重启电脑然后设置为启动盘),发现自己安装的所有的第三方应用并不能正常打开,具体症状就是双击exe后,图形界面没有任何反应,从任务管理器可以看见进程被创建然后迅速又消失了。

在(并没有花多少时间)的排插之后,认定是parallel desktop的问题,卸载tool之后重启一切正常。猜测应该是tool在中间有一步会跟被寄生系统进行交互(例如添加dock图标),但是不在虚拟机启动的话并不能调用相关的组件,导致加载失败退出。

复习总结(9)数据库原理(1)

范式:

第一范式:属性不可再分

第二范式:所有非关键字段都完全依赖于任意一组候选关键字。
可以理解为:单关键字的表都符合。多关键字表其中部分关键字跟其它属性没有依赖关系。
例如:
(学号,课程名称) → (姓名,年龄,成绩,学分)是违反第二范式,因为
(课程名称) → (学分)
(学号) → (姓名,年龄)
*例子来自百度百科
所以不满足第二范式

第三范式:满足第二范式的情况下,不存在传递的函数依赖
假如
关键字段 → 非关键字段x → 非关键字段y
则违反第三范式。

 

 

SQL语句:

常用SQL关键字:
SELECT 选择
SELECT DISTINCT选择并返回不重复的值
WHERE 限定选择条件,如值大小
AND OR 在WHERE语句中连接条件
ORDER BY 对语句进行排序
INSERT INTO 表名称 VALUES (值1, 值2,….) 对表插入值
JOIN 合并表(还有left join、right join等也需要了解)
GROUP BY分组(常用于聚合函数)
LIMIT 限制

还有其它常用语句,需要了解。

事务:

数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。

数据库的ACID特征:

  • 原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行
  • 一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束
  • 隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行
  • 持久性(Durability):已被提交的事务对数据库的修改应该永久保存在数据库中

 

数据库引擎:

  • ISAM:执行读取操作的速度很快,而且不占用大量的内存和存储资源。不支持事务处理,也不能够容错
  • MYISAM:MYISAM是MYSQL的ISAM扩展格式和缺省的数据库引擎。强调了快速读取操作。

  • HEAP:允许只驻留在内存里的临时表格。驻留在内存里让HEAP要比ISAM和MYISAM都快,但是它所管理的数据是不稳定的,而且如果在关机之前没有进行保存,那么所有的数据都会丢失。
  • INNODB和BERKLEYDB:比ISAM和MYISAM引擎慢很多,但是INNODB和BDB包括了对事务处理外来键的支持

更详细可以参考:http://www.cnblogs.com/0201zcr/p/5296843.html

复习总结(8)计算机网络(2)运输层

3.1:概述和运输层服务

 

为不同主机的应用进程之间提供了逻辑通信(logic communication)功能
将发送自应用进程的报文转换成运输层分组,术语为报文段(segment
有两种协议,TCPUDP

 

运输层和网络层的关系:运输层为不同主机的进程提供逻辑通信,而网络层提供了主机之间的逻辑通信。

 

多路复用(multiplexing)与多路分解(demultiplexing

将运输层报文段总的数据交付到正确的套接字的工作称为多路分解(demultiplexing)。

从源主机的不同套接字中收集数据块并为每个数据块封装上首部信息从而生成报文段并传递到网络层称为多路复用

多路复用的要求:

套接字有唯一标识符

每个报文段有特殊字段来指示该报文段说要交付的套接字

特殊字段是源端口号字段(source port number field)和目的端口字段(destination port number field

范围是0~65535

0·1023范围的称为周知端口号(well-known port number),保留给HTTPFTP等应用层协议的

 

无连接传输:UDP

有很多应用更适合用UDP:

应用层能更好地控制要发送的数据和发送时间

无需连接建立

无连接状态

分组首部开销小

UDP校验和

对报文段中的所有16比特字的和进行反码运算,求和时遇到的任何溢出都被回卷

得到的结果放在UDP报文中的检验和字段

接收方将所有的相加(包括检验和),如果结果是1111111111111111,则无差错

提供差错检测但是不能进行差错恢复。

 

可靠数据传输的原理

实现这种服务抽象是可靠数据传输协议(reliable data transfer protocol)的责任

TCP是在不可靠的端到端网络层协议(IP)上实现的。

 

3.4.3回退N步(重点!!!TCP的滑动窗口)

回退N步协议(Go-Back-N,GBN)允许发送发发送多个分组而不需要等待确认,但是也受限于在流水线中未确认的分组数不能超过某个最大允许数N

GBN协议常被称为滑动窗口协议(sliding-window protocol

GBN发送方必须响应以下三种类型的事件:

上层的调用:rdt_send()

收到ACK:对序号为n的分组的确认采取累积确认的方式

超时事件

接收方如果序号为n的正确接收,则发送ACK,其它所有情况都丢弃该分组

这种方式称为基于事件的编程(event-based programming

 

TCP报文段结构
包括源端口号和目的端口号,校验和字段(checksum field

 

TCP拥塞控制

1加性增,乘性减

2慢启动:一开始很慢的速率发送但是以指数速度增加发送速率

3对超时事件作出反应

 

TCP的三次握手四次分手(超级重点)

 

(图来自互联网,原出处不详)

 

复习总结(7)Java那些近义词们

int 和Ingeter

int是Java的基本数据类型。Java是面向对象的,这就带来了一些不便,所以需要包装类,把基本类型装箱称为对象。所以Ingeter是包装类,把基本类型包装为一个对象。相似的还有float和Float,double和Double等。

详细参考包装类基本知识。

相关问题:
包装类和基本数据类型的==结果
包装类之间的==结果

 

String、StringBuffer和StringBuilder

String是不可变对象,StringBuffer和StringBuilder是可变对象。
StringBuffer线程安全,StringBuilder线程不安全。

通常情况下,优先使用StringBuilder,因为没有线程同步,使得效率更高。
通常不使用String,因为不可变对象在每次修改的时候都会创建新对象,过多旧对象回收会影响效率。

Hashtable和Hashmap

Hashtable线程安全,Hashmap需要手动同步。
Hashtable不允许null,Hashmap允许null(两者都包括key和value)
Hashmap是新框架用来代替Hashtable的类,建议使用Hashmap

 

Arraylist和Vector

Vector有线程同步,线程安全,同时也导致访问相对较慢。
都是使用数组进行存储,但是每次扩充的大小不一样。

 

多线程的run和start

只调用run,实际上只是单纯的调用,没有多线程运行,后续语句会等待调用执行完再继续进行。
调用start后,启动了一个新进程并使进程进入就绪态,但是并没有立即启动。当得到时间片后,就会调用run方法。

 

sleep和wait

sleep在睡眠时,仍然持有锁。
wait在睡眠时释放锁。

实际上线程的状态也不一样。

图来自https://my.oschina.net/mingdongcheng/blog/139263

collection 和 collections

java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。

java.util.Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。
(原出处不详)

复习总结(6)软件测试software Testing(1)

文章内含图片均来自互联网且原作者不详

TDD: Test-Driven Development测试驱动开发

 

V模型,W模型,H模型

 

公理

Axiom 1 :It is impossible to test a program completely
Axiom 2: Software testing is a risk-based exercise
Axiom 3: Testing cannot show the absence of bugs
Axiom 4:The more bugs you find, the more bugs there are

Axiom 5: Not all bugs found will be fixed
Axiom 6: It is difficult to say when a bug is indeed a bug
Axiom 7: Specifications are never final
Axiom 8: Software testers are not the most popular members of a project
Axiom 9:Software testing is a disciplined and technical profession

 

软件测试方法分类

 

测试策略的概念

测试用例

  • 满足特定目的的测试数据、测试代码、测试规程的
    集合
  • 是发现软件缺陷的最小测试执行单元
  • 有特殊的书写标准和基本原则

测试用例设计生成的基本准则:
测试用例的代表性:能够代表并覆盖各种合理的
和不合理、合法的和非法的、边界的和越界的、
以及极限的输入数据、操作和环境设置等;
测试结果的可判定性:即测试执行结果的正确性
是可判定的,每一个测试用例都应有相应的期望
结果;
测试结果的可再现性:即对同样的测试用例,系
统的执行结果应当是相同的。

 

黑盒测试Black-Box-testing

测试用例设计技术
  • 等价类划分方法
  • 边界值分析方法
  • 错误推测方法
  • 判定表驱动分析方法
  • 因果图方法
  • 场景法

场景法步骤总结:
1、设计场景:通过用例的主事件流和备选事
件流的组合给出不同的场景
2、设计测试用例标准覆盖场景
3、根据测试用例标准给出具体的测试数据

 

白盒测试

逻辑分支覆盖法:

语句覆盖
判定覆盖
条件覆盖
判定/条件覆盖
条件组合覆盖

路径法:
路径覆盖
基本(独立)路径覆盖

 

复习总结(5)计算机网络(1)应用层

2.1应用层协议原理

应用程序体系结构:两种主流结构:
客户机/服务器体系结构(client-server architecture)
P2P体系结构(P2P architecture)

进程通讯:
进程与计算机网络之间的接口:套接字(socket)

四个方面对应用程序服务要求进程分类:
可靠数据传输(reliable data transfer)
吞吐量。
定时
安全性

因特网提供的运输服务:
TCP服务:面向连接服务、可靠数据传输服务
UDP服务:轻量级传输层协议。无连接,不能保证被接收到,可以乱序到达,没有拥塞控制机制
不提供的服务:不能提供任何有关定时或带宽的保证
进程寻址:用IP地址标识主机,端口号用于标识进程

应用层协议(application-layer Protocol)定义了:
交换的报文类型,如请求报文和响应报文
报文类型的语法
字段的语义
进程何时发送报文以及响应的规则

Web应用和HTTP协议(HyperText Transfer Protocol)

2.2.2:非持久连接(non-persistent connection)和持久连接(persistent connection)

HTTP报文格式:

http请求报文

 

http响应报文

 

用户与服务器的交互:cookie

 

FTP(File Transfer Protocol):

 

因特网的目录服务

主机的识别方法是它的主机名hostname、IP地址

DNS提供的服务
需要一种能进行主机名到IP地址转换的目录服务,就是域名系统(Domain Name System)
DNS是:
(1)一个由分布的DNS服务器实现的分布式数据库
(2)一个允许主机查询分布式数据库的应用层协议
DNS运行在UDP上,使用53端口

提供一些重要的服务:
主机别名(host aliasing)
邮件服务器别名(mail server aliasing)
负载分配(load distribution)

 

DNS查询

利用了递归查询(recursive)和迭代查询(iterative query)

Type = A时,Value是主机名的IP地址
Type=NS时,Name是域,Value是知道如何获得该域中的IP地址的权威DNS服务器的主机名
Type = CNAME,Value是主机对应的规范主机名
Type = MX,Value是邮件服务器的规范主机名