概述

多数据源单服务写入, 分布式事务实现

使用随机数控制产生异常

注: 网上很多都是只有多数据源配置,实际不能控制事务统一回滚,
单服务场景下如果多个数据源只有一个写,剩下都是读, 则不需要分布式事务

为减少篇幅,详细代码在代码仓库,可自行参考

版本

springboot 2.1.7.RELEASE

配置引入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jta-atomikos</artifactId>
</dependency>

增加配置类

AtomikosJtaPlatform

JPAAtomikosTransactionConfig Atomikos事务配置类

PrimaryConfig 主数据源配置

SecondaryConfig 其它数据源配置

数据对象实现

User

增加仓储实现

需要分别实现primary和secondary, 从而支持多个数据源访问

PrimaryUserRepository

SecondaryUserRepository

实现服务类

PrimaryUserService

SecondaryUserService

ExampleService

负责统一调用 PrimaryUserService 和 SecondaryUserService,
模拟一个服务同时访问多个服务类(每个服务类引用了不同数据源)

如果其中某个服务抛出异常,则整个事务回滚, @Transactional(rollbackOn =
Exception.class) 是必须的

测试

com.example.springbootatomikos.services.UserServiceTest#testSave

代码

github地址

gitee地址

目标

通过指纹识别解锁slim-lock

环境

操作系统archlinux

桌面管理器slim

锁屏slimlock

硬件 Thinkpad T480

注: 指纹设备id, 06cb:009a

安装

测试设备 lsusb

1
2
3
4
5
6
7
8
9
10
11
12
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 002: ID 0bda:0316 Realtek Semiconductor Corp. Card Reader
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub

# 这玩意儿应该就是指纹设备了
Bus 001 Device 005: ID 06cb:009a Synaptics, Inc. Metallica MIS Touch Fingerprint Reader

Bus 001 Device 004: ID 04f2:b604 Chicony Electronics Co., Ltd Integrated Camera (1280x720@30)
Bus 001 Device 003: ID 8087:0a2b Intel Corp. Bluetooth wireless interface
Bus 001 Device 002: ID 3044:50e0 MIIIW MW Keyboard Air Mini
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

安装libfprint-vfs009x-git (测试不通过)

yaourt -S libfprint-vfs009x-git

python-vlidity(推荐)

https://github.com/uunicorn/python-validity

安装: yaourt -S python-validity

录入指纹及解锁

fprintd-enroll

按照下述同时,录入指纹,直到completed

1
2
3
4
5
6
7
8
9
10
11
Using device /net/reactivated/Fprint/Device/1
Enrolling right-index-finger finger.
Enroll result: enroll-stage-passed
Enroll result: enroll-stage-passed
Enroll result: enroll-stage-passed
Enroll result: enroll-stage-passed
Enroll result: enroll-stage-passed
Enroll result: enroll-stage-passed
Enroll result: enroll-stage-passed
Enroll result: enroll-stage-passed
Enroll result: enroll-completed

校验指纹是否正常fprintd-verify

1
2
3
4
Using device /net/reactivated/Fprint/Device/1
Listing enrolled fingers:
- #0: WINBIO_ANSI_381_POS_RH_INDEX_FINGER
Verify result: verify-match (done)

查看当前用户指纹 fprintd-list 用户名

1
2
3
4
5
found 1 devices
Device at /net/reactivated/Fprint/Device/1
Using device /net/reactivated/Fprint/Device/1
Fingerprints for user zhaozhiwei on DBus driver (press):
- #0: WINBIO_ANSI_381_POS_RH_INDEX_FINGER

ThinkPadT480 slimlock指纹解锁

vim /etc/pam.d/system-local-login

将pam_fprintd.so添加到auth部分的顶部

auth sufficient pam_fprintd.so

重新启动计算机,会提示扫描手指以解锁登录(指纹灯亮)

slimlock认证后直接回车,不需要输入密码

问题列表

Impossible to enroll: GDBus.Error:net.reactivated.Fprint.Error.NoSuchDevice: No devices available

运行fprintd-enroll报错

https://wiki.archlinux.org/title/Lenovo_ThinkPad_T470#Fingerprint_reader

Install fprintd and libfprint-vfs009x-git AUR, then reboot. You can now
enroll your fingers with fprintd-enroll.

github下载很慢

将repository导入到gitee中,并且注意该项目有子模块,
所有需要手动增加.gitmodules

https://gitee.com/zhaozhiwei_1992/libfprint.git

https://gitee.com/zhaozhiwei_1992/libfprint-tod-vfs0090.git

libfprint/meson.build:1:0: ERROR: Unknown options: "x11-examples"

The x11-examples option seems to have been removed. It looks like it's
been replaced by "gtk-examples". I edited that in PKGBUILD and it
built successfully.

https://aur.archlinux.org/packages/libfprint-vfs009x-git

修改build文件, x11-example改成gtk-example

libfprint-vfs009x-git和fprintd >=1.92+版本冲突

安装低版本 sudo pacman -U
https://archive.archlinux.org/packages/f/fprintd/fprintd-1.90.1-1-x86_64.pkg.tar.zst

list_devices failed: No devices available

thinkpad t480 指纹id为 06cb:009a, 上述一些工具不支持,
直接使用python-validity即可

环境

archlinux

桌面管理器i3wm

登录管理器 slim

python 3.10.4

dlib

1
pip install --user -i https://pypi.tuna.tsinghua.edu.cn/simple dlib

face_recognition 依赖dlib

1
pip install --user -i https://pypi.tuna.tsinghua.edu.cn/simple face_recognition

opency 读取摄像头

1
pip install --user -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python

笔记本内置摄像头

流程图

代码

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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
"""
人脸识别认证

使用摄像头检验当前用户是否匹配
"""
# -*- coding: utf-8 -*-
import cv2
import os
import face_recognition
import pyautogui
import time


class AuthByFace:

def __init__(self, clicked, clocked):
self.clicked = clicked
self.clocked = clocked
# 设置图像保存目录
self.SUCCESS_DIR = os.environ['HOME'] + "/Pictures/authFaces/success/"

# 认证通过返回true
def isAuthSuccess(self):

# 获取摄像头中人脸
cameraCapture = cv2.VideoCapture(0)
result, image = cameraCapture.read()
if result:
# cameraImageRgb = image[:, :, ::-1]
# 摄像头中的人脸位置, 可能出现多张脸
cameraImageFaceLocations = face_recognition.face_locations(image)
# 摄像头中人脸进行编码
cameraImageEncodings = face_recognition.face_encodings(image, cameraImageFaceLocations)[0]

# 使用仓库中文件 测试匹配
# unknownImage = face_recognition.load_image_file(self.SUCCESS_DIR + "image_1.jpg")
# cameraImageEncodings = face_recognition.face_encodings(unknownImage)[0]

personNames = []
knownImageEncodings = []
# 跟所有保存的人脸比对
files = os.listdir(self.SUCCESS_DIR)
for file in files:
if file.endswith("jpg") or file.endswith("png"):
name, _ = os.path.split(file)
personNames.append(name)
knowImagePath = self.SUCCESS_DIR + file
knownImage = face_recognition.load_image_file(knowImagePath)
# 将仓库中照片全部编码, 后续比对需要
knownImageEncodings.append(face_recognition.face_encodings(knownImage)[0])

# 遍历locations,face_encodings,识别图片中的人脸
matchs = face_recognition.compare_faces(knownImageEncodings, cameraImageEncodings)
print("hhaha", matchs)
for index, match in enumerate(matchs):
if match:
# 有一个匹配就返回
print("图像: ", personNames[index], "匹配成功")
return True

# 打开摄像头, 监听鼠标事件
def onMouse(self, event, x, y, flags, param):
# 点击左键, 重置click状态
if event == cv2.EVENT_LBUTTONUP:
self.clicked = True

def savePicture(self):
# 打开摄像头
# VideoCapture()中参数是0,表示打开笔记本的内置摄像头,
# 参数是视频文件路径则打开视频
cameraCapture = cv2.VideoCapture(0)
if not cameraCapture.isOpened():
print("摄像头未打开~~")
exit()
cameraCapture.set(3, 100)
# 帧宽度和帧高度都设置为100像素
cameraCapture.set(4, 100)
cv2.namedWindow('MyWindow')
cv2.setMouseCallback('MyWindow', self.onMouse)
# 点击左键保存
print('showing camera feed. Click window or press and key to stop.')
result, image = cameraCapture.read()
# True/False 是否读取到照片
print(result)

# 点击鼠标左键后, 保存图片, 关闭窗口
while result and cv2.waitKey(1) == -1 and not self.clicked:
cv2.imshow('MyWindow', cv2.flip(image, 0))
result, image = cameraCapture.read()
name = self.SUCCESS_DIR + 'image_0.jpg'
cv2.imwrite(name, image)
cv2.destroyWindow('MyWindow')
cameraCapture.release()


if __name__ == '__main__':
authByFace = AuthByFace(False, False)

# 仓库没有照片则先录入照片
files = os.listdir(authByFace.SUCCESS_DIR)
if len(files) < 1:
authByFace.savePicture()
else:
# 锁定状态才会走这个认证逻辑
# 每1分钟运行一次认证
while True:
time.sleep(10)
try:
isSuccess = authByFace.isAuthSuccess()
if authByFace.clocked and isSuccess:
# 认证通过则解开锁屏
print("认证通过")
# 输入锁屏密码
pyautogui.typewrite("1")
pyautogui.press("enter")
pyautogui.press("Esc")
authByFace.clocked = False
elif not isSuccess:
# 如果认证不通过, 调用系统快捷键, 锁定屏幕
pyautogui.hotkey('win', 'c')
pyautogui.press(['l'], interval=0.1)
# 对象设置为锁定状态
authByFace.clocked = True
except Exception as exc:
print(type(exc))
if not authByFace.clocked:
pyautogui.hotkey('win', 'c')
pyautogui.press(['l'], interval=0.1)
# 对象设置为锁定状态
authByFace.clocked = True

开启启动

方式1 systemd (未通过)

经过测试,
无法将该程序放入到systemd单元,跟cv2等包有关系,引入就启动失败

方式2

直接加入到i3wm的开机启动即可,加载该文件时图形界面已经加载,正合适

1
exec --no-startup-id /usr/bin/python ~/workspace/python/demo/AuthByFace.py > /tmp/authByFace.log 2>&1

参考

https://www.cnblogs.com/sclu/p/12626553.html

问题列表

解决python安装opencv速度慢

使用清华镜像(速度快)

pip install –user -i https://pypi.tuna.tsinghua.edu.cn/simple
opencv-python

cpu占用飙升

现象

系统访问很慢

排查

top 获取进程pid

top -Hp pid, 查看线程情况,获取线程id

print "%x" "线程id" #输出16进制线程id

jstack 进程pid > /tmp/jstack.txt

在jstack.txt中搜索上述16进制线程id, 紧跟着就是问题原因

jmap

查看最耗费cpu的线程堆栈信息

cat stack |grep -i 34670 -C10 –color

备注

并发场景下使用currenthashmap替代hashmap, 避免死循环

普通屏幕

连根线就行, 跳过

如何将手机/平板/其它电脑作为扩展屏幕

一些可行的方案

如果只是为了演示屏幕,方案很多, 使用各种远程工具啥的都可以如anydesk, 向日葵等.

如果是扩展, 那必须要是要支持部分内容到扩展屏幕

可以配置活动窗口如deskreen

采用vnc的工具如 VirtScreen

前提

基于Intel集显中的Virtualheads功能, 目前笔记本也是集显,没试其他方案

这里也是采用vnc技术来搞, 如果是用现成的推荐virtscreen

扩展屏在

环境

archlinux(主) + i3wm桌面管理器

android(扩展) 小米平板

xrandr设置屏幕扩展

将笔记本屏幕扩展到android平板上, 并且采用分屏方式

查看现有配置

~: xrandr

1
2
3
4
5
6
7
8
9
10
Screen 0: minimum 8 x 8, current 1920 x 1080, maximum 32767 x 32767
eDP1 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 310mm x 170mm
1920x1080 60.02*+ 59.93
1680x1050 59.88
1400x1050 59.98
1600x900 60.00 59.95 59.82
DP1 disconnected (normal left inverted right x axis y axis)
DP2 disconnected (normal left inverted right x axis y axis)
HDMI1 disconnected (normal left inverted right x axis y axis)
HDMI2 disconnected (normal left inverted right x axis y axis)

该命令显示了电脑当前的显示状态,Screen 0
是当前正在显示的屏幕的分辨率参数,eDP1是笔记本内置显示屏当前的分辨率参数,下面的一堆数字是该显示屏所支持的分辨率及刷新率,最底下的三行分别是
HDMI 接口输出及虚拟输出,如果没有连接则会显示disconnect

增加虚拟屏幕

  1. 使用cvt命令获取所需分辨率的相应配置信息,
    如我想让扩展屏幕分辨率为1920x1080

    ~: cvt 1920 1080

    1
    2
    # 1920x1080 59.96 Hz (CVT 2.07M9) hsync: 67.16 kHz; pclk: 173.00 MHz
    Modeline "1920x1080_60.00" 173.00 1920 2048 2248 2576 1080 1083 1088 1120 -hsync +vsync

    其中第二行 Modeline 后面的内容 是接下来需要的

  2. 产生新的分辨率模式 xrandr –newmode

    ~: xrandr –newmode
    上述Modelline后边部分,或者直接使用下面命令一步到位

    ~: xrandr –newmode `cvt 1920 1080|tail -n1 |sed 's/Modeline
    //' |sed 's/"//g'`

    此时通过查看xrandr, 多出了Virtual1部分,

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Screen 0: minimum 8 x 8, current 1920 x 1080, maximum 32767 x 32767
    eDP1 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 310mm x 170mm
    1920x1080 60.02*+ 59.93
    1680x1050 59.88
    1400x1050 59.98
    DP1 disconnected (normal left inverted right x axis y axis)
    DP2 disconnected (normal left inverted right x axis y axis)
    HDMI1 disconnected (normal left inverted right x axis y axis)
    HDMI2 disconnected (normal left inverted right x axis y axis)
    VIRTUAL1 disconnected (normal left inverted right x axis y axis)
    1920x1080_60.00 (0x20a) 173.000MHz -HSync +VSync
    h: width 1920 start 2048 end 2248 total 2576 skew 0 clock 67.16KHz
    v: height 1080 start 1083 end 1088 total 1120 clock 59.96Hz
  3. 启用新的显示器

    ~: xrandr –addmode VIRTUAL1 "1920x1080_60.00"
    注意VIRTUAL1变成了connected

    1
    2
    VIRTUAL1 connected (normal left inverted right x axis y axis)
    1920x1080_60.00 59.96

    xrandr –output VIRTUAL1 –right-of eDP1 –auto eDP1为主屏幕,
    扩展屏幕在右边,所以使用right-of,
    该命令最好执行两次,否则可能不生效

  4. 关闭扩展屏设置

    ~: xrandr –output VIRTUAL1 –off

X11vnc

启动x11vnc server服务并设置扩展屏

x11vnc -rfbport 5900 -clip 1920x1080+1920+0 -wait 1 –defer 1 -nowf -sb
0

x11vnc -rfbport 5900 -clip xinerama1 -wait 1 –defer 1 -nowf -sb 0

1
2
3
4
5
6
-rfbport:指定了连接所用的端口,默认为5900也可以自行设置。
-clip:该命令设置x11vnc映射屏幕的范围,可以使用-clip WxH+X+Y来手动设置映射范围,也可以使用-clip xinerama0来自动映射显示器,其中xinerama0为屏幕设置中从左往右数第一个显示器,以此类推xinerama1为第二个,如果你的主屏幕在左边虚拟屏幕在右边,那如果设置为xinerama0就会将主屏幕的显示内容复制到虚拟屏幕上,也就是两个屏幕的内容一样了,这时就应该设置为xinerama1。
-wait:是两次屏幕抓取的时间间隔,默认为 20 ms 效果比较卡顿,设置为 1 的话会尽可能降低抓取时间减少延迟。
-defer:向vnc客户端发送更新的间隔,默认也为 20 ms,设置为 1 可以尽可能提高发送频率(但对网速的要求就高了)。
-nowf:在移动窗口到虚拟屏幕时显示内容,否则会显示为一个框。
-sb:设置休眠时间,默认为 60s 也就是如果屏幕 60s 内没有活动的话就停止数据传送,这样会导致有时鼠标从主屏移动到虚拟屏幕时会卡顿,设置为 0 后就不会休眠了

客户端连接工具

安卓下可以使用bvnc

默认配置地址如192.168.1.xx:5900即可

adb工具(usb连接才需要)

打开手机的开发者模式, 并且选择usb调试

电脑端安装adb工具

使用adb reverse tcp:5900 tcp:5900 创建代理

扩展端配置host地址为127.0.0.1:5900即可

参考

https://blog.csdn.net/u010750137/article/details/104277527

测试

将活动程序移动到扩展屏

Win+Shift+Right

光标定位扩展屏

Win+Right 注意观察鼠标光标

问题处理

安装virtscreen以来python-quamash提示编译不通过(弃用)

python版本过高,考虑降低版本

找不到xrandr: cannot find mode "1920x1080_60.00"

执行该命令时提示上述错误xrandr –delmode VIRTUAL1 "1920x1080_60.00"

1
2
3
4
VIRTUAL1 disconnected (normal left inverted right x axis y axis)
1920x1080_60.00 (0x20a) 173.000MHz -HSync +VSync
h: width 1920 start 2048 end 2248 total 2576 skew 0 clock 67.16KHz
v: height 1080 start 1083 end 1088 total 1120 clock 59.96Hz

注意这里的mode不能有双引号, 必须是1920x1080_60.00
而不是"1920x1080_60.00"

bvnc客户端连接失败

确认服务端已经启动,客户端连接失败, 一般为防火墙导致

关闭防火墙systemctl stop iptables.service

增加防火墙规则(推荐)

扩展没效果?

该命令最好执行两次,否则可能不生效

xrandr –output VIRTUAL1 –right-of eDP1 –auto

环境

polardb版本

1
2
3
4
5
6
7
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>polardb-jdbc18</artifactId>
<version>1.0.0</version>
<scope>system</scope>
<systemPath>${lib.dir}/polardb-jdbc18.jar</systemPath>
</dependency>

mybatis版本

直接使用springboot引入

1
2
3
4
5
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>

问题描述

1
2
3
4
5
6
7
javax.servlet.ServletException: org.springframework.dao.DataIntegrityViolationException: 
### The error may exist in com/xx/templatedef/dao/oracle/XXTemplateDef_SqlMap.xml
### The error may involve com.xx.templatedef.dao.XXTemplateDefDao.selectTemplateDefByCategoryAndState-Inline
### The error occurred while setting parameters
### SQL: select * from act_xx_tem_def where category=? and deploy_state=1
### Cause: com.aliyun.polardb.util.PSQLException: 不良的类型值 long :
com.aliyun.polardb.util.PSQLException: canot convert the column of type BYTEA to requested type long;

原因

mybatis查询act_tem_def表涉及到blob字段(content_bytes),
默认的BlobTypeHandler的getBlob方法不适用, 需要重写handler

解决方案

  1. 在业务下重写BlobTypeHandler, 获取getBinaryStream然后转换byte数组
  2. mapper.xml -> resultmap中, 加入下述转换
1
2
<result column="CONTENT_BYTES" property="contentBytes" jdbcType="BLOB"
typeHandler="com.example.springbootpolardb.handler.PolarDbBlobTypeHandler"/>

转换逻辑

1
2
3
4
5
6
7
8
9
public static byte[] toByteArray(InputStream input) throws IOException {
ByteArrayOutputStream output = new ByteArrayOutputStream();
byte[] buffer = new byte[4096];
int n = 0;
while (-1 != (n = input.read(buffer))) {
output.write(buffer, 0, n);
}
return output.toByteArray();
}

代码

::: {.center}
xx公司

2020-01-01
:::

文档管理

合理地管理主文档,
确保文档版本的及时更新,同时保持备份文档和源文档的一致性。

版本管理


本版本修订日期 2019-08-12 生效日期 2019-08-12


版本 生效日期 变更内容 编制人


V1.0 2020-01-01 初稿编写完成 xx

测试目的

终验测试是项目终验的组成部分,用于各方现场验证系统各功能可用,试运行中发现的问题是否已经解决。

测试对象

描述所测试的软件系统名、版本等信息

测试方式

由业主方、承建方、监理方、总集方代表在用户现场,依据本方案进行测试,并记录测试结果,时间以半天到一天为宜。测试结束后,现场编制终验测试报告并由各方签字确认。

测试通过准则

终验测试方案中所列所有测试项均已通过,则终验测试通过,否则为不通过。

测试时间

说明实施测试的时间

测试地点

说明实施测试的地点

测试参与人员

说明参与终验测试的各方人员,要说明所属单位

功能测试结果记录

根据终验测试方案,以表格的方式列出各项所测功能是否通过

问题解决情况记录

根据终验测试方案,以表格的方式列出各项所测问题是否全部解决

测试结论

给出终验测试是否通过的结论。

内容审核要点:

参考

https://www.jianshu.com/p/a7984927cfb9

::: {.center}
xx公司

2020-01-01
:::

文档管理

合理地管理主文档,
确保文档版本的及时更新,同时保持备份文档和源文档的一致性。

版本管理


本版本修订日期 2019-08-12 生效日期 2019-08-12


版本 生效日期 变更内容 编制人


V1.0 2020-01-01 初稿编写完成 xx

测试目的

终验测试是项目终验的组成部分,用于各方现场验证系统各功能可用,试运行中发现的问题是否已经解决。

测试对象

描述所测试的软件系统名、版本等信息

测试方式

由业主方、承建方、监理方、总集方代表在用户现场,依据本方案进行测试,并记录测试结果,时间以半天到一天为宜。测试结束后,现场编制终验测试报告并由各方签字确认。

测试通过准则

本测试方案中所列所有测试项均已通过,则终验测试通过,否则为不通过。

功能测试

功能名1

以表格方式列出子功能、测试方法、是否通过、备注

功能名2

。。。

试运行期间问题解决情况测试

以表格方式列出问题、问题描述、测试方法、是否通过、备注

内容审核要点:

参考

https://www.jianshu.com/p/a7984927cfb9

::: {.center}
xx公司

2020-01-01
:::

文档管理

合理地管理主文档,
确保文档版本的及时更新,同时保持备份文档和源文档的一致性。

版本管理


本版本修订日期 2019-08-12 生效日期 2019-08-12


版本 生效日期 变更内容 编制人


V1.0 2020-01-01 初稿编写完成 xx

引言

编写目的

说明编写这份详细设计说明书的目的,指出预期的读者范围。

背景

说明:

待开发的软件系统的名称;

列出本项目的任务提出者、开发者、用户以及将运行该项软件的单位。

术语和缩略语

列出本文件中用到的专门术语的定义和缩写词的原词组。

参考资料

列出要用到的参考资料,如:

本项目的经核准的计划任务书或合同、上级机关的批文;

属于本项目的其他已发表的文件,包括软件需求说明书、软件概要设计说明等;

本文件中各处引用的文件、资料,包括所要用到的软件开发标准。

列出这些文件的标题、文件编号、发表日期和出版单位,说明能够得到这些文件资料的来源。

系统结构

以表格方式列出本程序系统内的每个程序(包括每个模块和子程序)的名称、标识符和它们之间的层次结构关系。并用文字说明每个程序完成的功能,以及互相之间的调用关系。

程序1(标识符)设计说明

从本章开始,逐个地给出各个层次中的每个程序的详细设计。以下给出的提纲是针对一般情况的。对于一个具体的模块,可能根据需要在其说明条目上有适当增减。

程序描述

给出对该程序的简要描述,主要说明安排设计本程序的目的意义,并且说明本程序的特点。

功能

说明该程序应具有的功能,可采用IPO图(即输入-处理-输出图)的形式。

性能

说明对该程序的全部性能要求,包括对精度、灵活性和时间特性的要求。

输入项

给出对每一个输入项的特性,包括名称、标识、数据的类型和格式、数据值的有效范围、输入的方式、数量和频度、输入媒体、输入数据的来源和安全保密条件等等。

输出项

给出对每一个输出项的特性,包括名称、标识、数据的类型和格式、数据值的有效范围、输出的形式、数量和频度、输出媒体、对输出图形及符号的说明、安全保密条件等等。

算法

详细说明本程序所选用的算法,具体的计算公式和计算步骤。

流程逻辑

用图表(例如流程图、判定表等)辅以必要的说明来表示本程序的逻辑流程。

接口

用图的形式说明本程序所隶属的上一层模块及隶属于本程序的下一层模块、子程序,说明参数赋值和调用方式,说明与本程序相直接关联的数据结构。

限制条件

说明本程序运行中所受到的限制条件。

单元测试

说明对本程序进行单元测试的计划和方式,包括单元测试用例的设计等。

尚未解决的问题

说明在本程序的设计中尚未解决而设计者认为在软件完成之前应解决的问题。

程序2(标识符)设计说明

......

内容审核要点:

本文档内容与概要设计说明、软件需求规格说明等文档中的内容是否一致性;

所述内容是否完备;

各子程序模块描述是否清楚;

是否有必要的单元测试用例编制方面的考虑;

程序模块间关系是否清楚准确。

参考

https://www.jianshu.com/p/a7984927cfb9

::: {.center}
xx公司

2020-01-01
:::

文档管理

合理地管理主文档,
确保文档版本的及时更新,同时保持备份文档和源文档的一致性。

版本管理


本版本修订日期 2019-08-12 生效日期 2019-08-12


版本 生效日期 变更内容 编制人


V1.0 2020-01-01 初稿编写完成 xx

引言

标识

本条应包含本文档及其所适用的系统和软件的完整标识,(若适用)包括标识号、标题、缩略词语、版本号、发行号。

系统概述

本条简述本文档适用的系统和软件的用途。应描述系统与软件的一般性质;描述系统基本功能;概述本系统或软件的开发、测试、试运行和维护的历史;标识项目的承建方、业主方、总集方、监理方等;标识系统当前和计划的运行现场;

文档概述

本条应概括本文档的用途与内容,并描述与其使用有关的保密性方面的要求。

引用文件

本条应列出本文档引用的所有文档的编号、标题、修订版本、日期和来源。

术语与缩略语

提供此文档中用到的专门术语的定义和缩写词的原词组。

测试概述

测试目的

描述本次测试的目的。

测试内容

描述本次测试的主要内容,包括需要进行测试的功能和特性。可以引用测试计划和测试说明文档中的内容。对于出厂测试,要将用户文档的正确性测试作为测试的内容之一。

测试的质量目标

描述本次测试所要达到的质量目标,如A、B类bug低于多少个,系统响应时间、系统表现达到什么目标等等。

测试依据

描述本次测试的所依据的方案、文档和标准。

测试环境描述

描述本次测试的软硬件环境,包括使用的服务器的软硬件环境和配置,网络和客户端环境,部署情况说明等。与生产系统环境的差异。

测试时间

说明本次测试的执行时间。

测试人员及工作量

说明本次测试投入的人员、工作量,以及具体每个功能子模块的人员、计划工作量、实际工作量的分配。

测试问题记录

通过列表的方式列出测试发现的主要问题记录,包括问题编号、问题说明、对应测试用例、解决情况等。

测试结果分析及软件评价

对被测试软件的总体评价

根据本报告中所展示的测试结果,提供对该软件的总体评价,包括遗留bug的统计与分析、软件存在的主要问题、是否达到本次测试的质量目标等。

测试技术分析

分析测试技术对测试结果的影响。

测试环境的影响

对测试环境与操作环境的差异进行评估,并分析这种差异对测试结果的影响。

改进建议

针对对被测试软件还存在的问题,提出改进建议。

附录

附录可用来提供那些为便于文档维护而单独出版的信息(例如图表、分类数据)。为便于处理,附录可单独装订成册。附录应按字母顺序(A,B等)编排。

文档中,如果定义了缺陷等级分类代码,需要在附录中给出其定义。

内容审核要点:

是否全面、真实地反映了测试执行过程;测试记录是否完整、有效;

是否全面总结了测试执行过程中发现的软件问题和缺陷;

对问题及缺陷的判断和定位是否准确;

所测试内容与测试计划是否一致。

参考

https://www.jianshu.com/p/a7984927cfb9

0%