软件测试十年老鸟——分享学习实战经验,看完直呼窝靠

2023-10-30

 前言

作为软件开发过程中一个非常重要的环节,软件测试越来越成为软件开发商和用户关注的焦点。完善的测试是软件质量的保证,因此软件测试就成了一项重要而艰巨的工作。要做好这项工作当然也绝非易事。

下面我着重谈谈自己在做软件测试工作中总结出来的一些经验和技巧,以供大家参考。

一、工作需求背景

  • 利用Pytest+Request+Allure+Jenkins实现接口自动化;
  • 实现一套脚本多套环境执行;
  • 利用参数化数据驱动模式,实现接口与测试数据分离
  • 使用logger定制实现自动化测试日志记录

二、接口自动化项目代码编写(先在window实现)

1 、项目准备

先在window安装响应的环境依赖

  • 安装python3.7(要保证pip能用,一般安装python3.7会自动安装pip)
  • 安装pytest框架---- pip install pytest
  • 安装request库---- pip install request
  • 安装openpyxl库(测试数据保存在excel中,需要依赖读取excel的库)---- pip install openpyxl
  • 安装pycharm(编写python脚本工具)

注意:可能还需要一些依赖的东西,项目步骤里会依据需要进行安装

2、 设计基于pytest的测试框架结构

在pycharm中开发构建项目结构

  • common:存放公共方法
  • config:存放环境配置信息
  • lib:存放第三方库
  • main:框架主入口
  • report:存放allure测试报告
  • test_case:存放测试用例
  • test_data:存放测试数据

3、实现接口公共请求发送能力

从这一步开始正式编写代码


封装http请求的公共能力(封装request库,变成自己的公共处理能力),放到common目录下。

import requests
import urllib3
# from urllib3.exceptions import InsecureRequestWarning

urllib3.disable_warnings()
# 加这句不会报错(requests证书警告)
# requests.packages.urllib3.disable_warnings(InsecureRequestWarning)


class HTTPRequests(object):
    def __init__(self, url):
        self.url = url
        self.req = requests.session()
        # 依据自己公司的请求头默认值配置
        self.head = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.2; WOW64; Trident/7.0; rv:11.0) like Gecko',
            'Accept': 'image/gif, image/jpeg, image/pjpeg, application/x-ms-application, application/xaml+xml, '
                      'application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, '
                      'application/msword, */*',
            'Accept-Language': 'zh-CN'}

    # 封装自己的get请求,获取资源
    def get(self, uri='', params='', data='', headers=None, cookies=None, verify=False):
        if headers is None:
            headers = self.head
        # print("请求头是:{}".format(headers))
        url = self.url + uri
        response = self.req.get(url, params=params, data=data, headers=headers, cookies=cookies, verify=verify)
        return response

    # 封装自己的post请求,获取资源
    def post(self, uri='', params='', data='', headers=None, cookies=None, verify=False):
        if headers is None:
            headers = self.head
        url = self.url + uri
        response = self.req.post(url, params=params, data=data, headers=headers, cookies=cookies, verify=verify)
        return response

    # 封装自己的put请求,获取资源
    def put(self, uri='', params='', data='', headers=None, cookies=None, verify=False):
        if headers is None:
            headers = self.head
        url = self.url + uri
        response = self.req.put(url, params=params, data=data, headers=headers, cookies=cookies, verify=verify)
        return response

    # 封装自己的delete请求,获取资源
    def delete(self, uri='', params='', data='', headers=None, cookies=None, verify=False):
        if headers is None:
            headers = self.head
        url = self.url + uri
        response = self.req.delete(url, params=params, data=data, headers=headers, cookies=cookies, verify=verify)
        return response

4、 抽离测试环境配置信息

这个步骤的目的有三个

  • 为了配置三个不同环境(测试、开发、生产)的URL,每个环境接口测试的URL是不一样的,设置这样一个枚举类,方便后面的程序根据不同的环境,获取不同环境的URL,里面的URL依据自己公司的地址修改,放到config目录
  • 获取token需要登录,这里可以设置一个全局的账号密码,这个账号密码获取的token可以给整个接口自动化使用
  • 配置获取token的uri,这个uri三个环境的是一致的,登录的接口依据环境只是URL不同,URI还是一致的。

import enum

class URLConf(enum.Enum):
    """环境配置信息"""
    url_mapping = {
        'dev': 'https://www.dev.com',
        'test': 'https://www.test.com',
        'prod': 'https://www.prod.com'
    }

    # token固定的用户名密码,固定用"/"分割用户名和密码
    email_user = {
        'dev': 'dev@qq.com',
        'test': 'zidonghua@qq.com/96e79218965eb72c92a549dd5a330112',
        'prod': 'prod@qq.com'
    }

    login_uri = r'/api/auth/login/account/v1'

5 、创建conftest.py放置一些公共的fixture

1、pytest_addoption,设置了只允许输入dev/test/prod三个参数,以区分测试、开发、生产三个环境


2、get_env的fixture,它的作用是你在命令行执行接口自动化时,可以输入--env test将对应的环境信息传入进去


3、http的fixture,这里依据--env test传入的环境信息,去枚举类里获取对应环境的URL,然后返回一个http的session,供测试案例使用


4、get_token_head,依据--env test传入的环境信息,调用获取token方法,并将token放置到请求头head里返回(token一般放在请求头里,这里依据自己公司的请求,返回对应的token信息就可以了)

import logging
import os

import pytest

from common.http_request import HTTPRequests
from config.url_config import URLConf


datadir = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "test_data")
logger = logging.getLogger('conftest日志')


def pytest_addoption(parser):
    # choices 只允许输入的值的范围
    parser.addoption(
        "--env", action="store", default='test', choices=['dev', 'test', 'prod'], help="set env"
    )


# 获取命令行参数的fixture
@pytest.fixture(scope='session')
def get_env(request):
    # print("fixutre..................")
    return request.config.getoption('--env')

# 声明一个返回http请求对象的fixture,所有用例在一个session中
# @pytest.fixture(scope='module', autouse=True)
@pytest.fixture(autouse=True)
def http(request):
    env = request.getfixturevalue("get_env")
    url_mapping = URLConf.url_mapping.value
    url = url_mapping.get(f'{env}')
    http = HTTPRequests(url)

    return http


@pytest.fixture(scope='session')
def get_token_head(request):
    env = request.getfixturevalue("get_env")
    url_mapping = URLConf.url_mapping.value
    url = url_mapping.get(f'{env}')
    http = HTTPRequests(url)

    user = URLConf.email_user.value
    user_list = user.get(f'{env}').split("/")
    username = user_list[0]
    password = user_list[1]

    param = {'clientType': 2,
             'language': 'en',
             'loginId': username,
             'loginPassword': password}

    logger.info("请求的url=={}".format(url))
    response = http.post(uri=r'/api/auth/login/account/v1', data=param)
    logger.info("获取的返回值是:".format(response.text))
    token = None
    if response.status_code == 200:
        token = response.json().get('result')['token']
    else:
        token = 'get token fail'

    head = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.2; WOW64; Trident/7.0; rv:11.0) like Gecko',
        'Accept': 'image/gif, image/jpeg, image/pjpeg, application/x-ms-application, application/xaml+xml, '
                  'application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, '
                  'application/msword, */*',
        'Accept-Language': 'zh-CN',
        'Authorization': token}

    yield head

6、 将测试数据放到excel中

我们的测试数据是放在excel中,注意,这里有prod\test\dev三个目录,对应三个环境的测试数据,我这里只创建了test测试环境的测试数据。这里的测试数据需要包含两部分:

  • 你调用接口传入的所有参数;
  • 你要断言的所有信息,因为你传的参数不同,返回的内容就不同,你断言的内容也就不相同了。

那么这时候,就需要一个读取excel的公共方法了,放到common里

# 创建解析excel的方法
import logging

from openpyxl import load_workbook

logger = logging.getLogger("读取excel")


class ParseExcel(object):
    def __init__(self, excelPath, sheetName):
        self.wb = load_workbook(excelPath)
        self.sheet = self.wb[sheetName]
        self.maxRowNum = self.sheet.max_row


    # 依据传入的数字,决定获取几列excel数据
    def getDataFromSheet(self, num):
        dataList = []
        for line in self.sheet.rows:
            tmplist = []
            for i in range(num):
                tmplist.append(line[i].value)
            dataList.append(tmplist)
            print("dadddddd:{}".format(dataList))

        return dataList[2:]

这里,还需要在test_data中,创建一个文件,为了获取前面test_data依据环境创建的dev/test或prod文件目录

注意:这里只有一个test或prod或dev的文字,是为了拼接....test_data/test目录获取对应环境的excel测试数据而使用的,每次环境切换前,需要更改这个文件,可能这并不是一个好方法,如果大家有找到更好的方法,也可以分享一下

7、开始编写自动化测试案例了

测试案例中有几个点,需要解释一下:
1、authBaseDir,这个就是根据test_data/test拼接出来的获取测试数据的目录
2、allure.feature,在测试报告中,会展现这个接口名称,这个名称最好与你公司的开发写的接口模块保持一致,方便后续查找问题
3、allure.story 这里也要与开发写的具体某个接口的名称保持一致。
4、pytest.mark.parametrize,这里就是运用的DDT数据驱动的模式,从excel中一条一条的获取数据,然后执行同一条接口测试用例,excel中比如有3条数据,那么就表示这个案例依据每一条数据的参数,总共执行了三次

# encoding: utf-8

"""
create by Arthur

Account Api模块
"""
import logging
import os

import allure
import pytest

from common.get_data_url import get_data_url
from common.parse_excel import ParseExcel

datadir = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "test_data")
data_url = get_data_url()
# 获取到test_data\test的目录,如果是prod环境,那么就是获取test_data\prod目录
authBaseDir = os.path.join(datadir, data_url)

logger = logging.getLogger("Account Api模块日志")


@allure.feature("AccountApi模块")
@pytest.mark.webtest
class TestAccountApi(object):
    """Query Related Achievements: /api/auth/account/achievement/related/query/v1

    """
    Query_Related_Achievements_dir = os.path.join(authBaseDir, 'Query_Related_Achievements.xlsx')
    logger.info("Query_Related_Achievements测试数据的路径是:{}".format(Query_Related_Achievements_dir))
    parse = ParseExcel(Query_Related_Achievements_dir, 'Sheet1')
    Query_Related_Achievements_params = parse.getDataFromSheet(5)

    @allure.story("Query Related Achievements(查询用户成就信息)")
    @pytest.mark.parametrize("clientType,language,retCode,istoken,result", Query_Related_Achievements_params)
    def test_001_Query_Related_Achievements(self, get_token_head, http, clientType, language, retCode, istoken, result):
        uri = '/api/auth/account/achievement/related/query/v1'
        params = {"clientType": clientType, "language": language}

        if istoken == 'yes':
            header = get_token_head
            response = http.get(uri=uri, params=params, headers=header)
            json_req = response.json()
            logger.info("Query_Related_Achievements有token的返回值是:{}".format(json_req))

            assert json_req.get('retCode') == 200
            assert json_req.get('result')[0]['smallImg'] == result
        else:
            response = http.get(uri=uri, params=params)
            json_req = response.json()
            logger.info("Query_Related_Achievements没有token的返回值是:{}".format(json_req))

            assert json_req.get('retCode') == 401
            assert json_req.get('message') == result

8 、集成allure

写到这里,是不是发现前面的allure.feature是不是用不了呢?这是因为我们还没有集成allure进去。
1、下载allure,放到lib目录下,使你的工程具备allure的能力。

2、pip install allure-pytest 安装pytest对应的allure包

9、 这时候就可以创建一些执行策略了

1、先在main中创建一个pytest.ini文件,设置一些执行参数

2、在main中创建执行策略

  • 先在run_pytest方法中,执行案例并生成allure的json格式的报告文件,这里可以带--env prod将对应环境信息传入,这里没有传是因为默认是test环境,不传入的话就是执行的test环境测试数据
  • general_report方法时将生成的json格式的报告,最终生成html文件放置到report下面的目录中
  • 创建一个线程,先执行run_pytest,再执行general_report,避免json文件没有生成,这样生成html文件的报告数据可能不全,甚至没有。

"""
所有案例执行并生成allure测试报告的执行策略
"""

import os
import sys
import threading
import pytest


sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/../')
from common.report import Report


project_root = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
report_dir = os.path.join(project_root, 'report')
# 存放测试结果的目录,会生成一推json文件
result_dir = os.path.join(report_dir, 'allure_result')
allure_report = os.path.join(report_dir, 'allure_report')

report = Report()

#  定义搜索条件,搜索所有以test开头的用例
tag = 'test'


def run_pytest():
    # --clean-alluredir
    # pytest.main(['-vv', '-s', '-m', 'webtest', f'--alluredir={result_dir}', '--clean-alluredir'])
    # 执行前清除allure_result数据,避免生成报告时,会把上次执行的数据带进去
    pytest.main(['-vv', '-s', '-k', f'{tag}', f'--alluredir={result_dir}', '--clean-alluredir'])


def general_report():
    # 调用cmd方法 report.allure,根据windows或linux环境判断
    # 然后执行生成报告的方法generate
    # --clean 覆盖路径,将上次的结果覆盖掉
    cmd = "{} generate {} -o {} --clean".format(report.allure, result_dir, allure_report)
    # 执行命令行命令,并通过read()方法将命令的结果返回
    print(os.popen(cmd).read())


if __name__ == '__main__':
    # 创建两个线程,分别执行两个方法
    run = threading.Thread(target=run_pytest)
    gen = threading.Thread(target=general_report)
    run.start()
    # 先执行第一个线程,这个线程执行完才会执行下面的线程和主线程
    run.join()
    gen.start()
    gen.join()

10、 自动化执行生成结果

在windows下,右键执行main下面的run_test_allure_html.py(就是上一个步骤的python文件),然后打开report/allure_report/index.html看看报告是否生成成功

福利:

软件测试工程师学习资源包

结语

这篇贴子到这里就结束了,最后,希望看这篇帖子的朋友能够有所收获。如果想以测试为长期发展职业目标,是需要时刻保持学习的,要使自己具备竞争力,无论你现在工作几年,只要行动起来,你就已经占优势了。祝大家2022年能升职加薪,没入职的就早日拿到心仪公司的offer,事事顺遂。

衷心感谢每一个认真阅读我文章的人

欢迎留言,或是关注我的专栏和我交流。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

软件测试十年老鸟——分享学习实战经验,看完直呼窝靠 的相关文章

  • 有效降低EMI干扰的PCB设计原则

    降低EMI干扰的一些PCB设计建议 1 通过在所有信号下提供低阻抗 连续的返回路径来减少地面反弹 尤其是在表层布线时 2 保持所有走线距离板的边缘至少5倍信号线宽 3 对于关键信号 尽量采用带状线布局 4 将高速率 大电流的组件尽可能远离I
  • 软件测试|深入了解Python中的super()函数用法

    简介 Python中的super 函数是一种强大的工具 用于在子类中调用父类的方法 它在面向对象编程中非常有用 可以让你轻松地扩展和重用现有的类 本文将详细介绍super 函数的用法 并提供一些示例来帮助你更好地理解它的功能 什么是supe
  • Docker 安全必知:最佳实践、漏洞管理与监控策略

    容器安全是实施和管理像 Docker 这样的容器技术的关键方面 它包括一组实践 工具和技术 旨在保护容器化应用程序及其运行的基础架构 在本节中 我们将讨论一些关键的容器安全考虑因素 最佳实践和建议 容器隔离 隔离对于确保容器化环境的强大性和
  • 软件测试|使用Python读写yaml文件,你会了吗?

    简介 YAML YAML Ain t Markup Language 是一种可读的数据序列化格式 它常用于配置文件和数据交换 Python 提供了许多库来处理 YAML 文件 在本文中 我们将探讨如何使用 PyYAML 库来读取和写入 YA
  • 《Spring 测试指南》:JPA、MockMvc 和 @SpringBootTest 详解

    测试 Spring 提供了一组测试工具 可以轻松地测试 Spring 应用程序的各个组件 包括控制器 服务 存储库和其他组件 它具有丰富的测试注释 实用程序类和其他功能 以帮助进行单元测试 集成测试等 JPA 测试 Spring JPA J
  • 软件测试|pycharm关联GitHub的详细步骤

    简介 GitHub 是全球最大的开源代码托管平台之一 而 PyCharm 是一款强大的 Python 集成开发环境 将两者结合使用 可以提高团队协作和代码管理的效率 本文将详细介绍如何在 PyCharm 中管理 GitHub 账号 包括如何
  • 软件测试|教你如何使用Python绘制出奥运五环旗

    简介 我们之前介绍过使用turtle来绘制正多边形 但是绘制正多边形只是turtle模块最基础的使用 我们可以使用turtle模块绘制出更多不一样的精彩图形 本文就来给大家介绍一个比较简单的turtle绘图实例 绘制奥运五环旗 初始化参数
  • 深入了解 Python MongoDB 操作:排序、删除、更新、结果限制全面解析

    Python MongoDB 排序 对结果进行排序 使用 sort 方法对结果进行升序或降序排序 sort 方法接受一个参数用于 字段名 一个参数用于 方向 升序是默认方向 示例 按名称按字母顺序对结果进行排序 import pymongo
  • 软件测试|使用matplotlib绘制多种柱状图

    简介 在数据可视化领域 Matplotlib是一款强大的Python库 它可以用于创建多种类型的图表 包括柱状图 本文将介绍如何使用Matplotlib创建多种不同类型的柱状图 并提供示例代码 创建基本柱状图 首先 让我们创建一个基本的柱状
  • 掌握 C# 变量:在代码中声明、初始化和使用不同类型的综合指南

    C 变量 变量是用于存储数据值的容器 在 C 中 有不同类型的变量 用不同的关键字定义 例如 int 存储整数 没有小数点的整数 如 123 或 123 double 存储浮点数 有小数点 如 19 99 或 19 99 char 存储单个
  • 软件测试|如何使用selenium处理iframe富文本输入框

    简介 在网页开发中 富文本框是常见的元素 用于输入富文本内容 如富文本编辑器或邮件编辑器 如果我们要使用Python和Selenium进行自动化测试或操作这种富文本框 可能会遇到一些挑战 本文将详细介绍如何使用Python和Selenium
  • 新手也能看懂的【前端自动化测试入门】

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 3k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • 做测试不会 SQL?超详细的 SQL 查询语法教程来啦!

    前言 作为一名测试工程师 工作中在对测试结果进行数据比对的时候 或多或少要和数据库打交道的 要和数据库打交道 那么一些常用的sql查询语法必须要掌握 最近有部分做测试小伙伴表示sql查询不太会 问我有没有sql查询语法这一块的文档可以学习
  • 会议设备:提升会议体验与效率的关键

    在当今高度信息化的社会 会议已成为企业 机构和团队之间交流与合作的重要方式 而会议设备的选择与使用 对于提升会议的体验与效率具有举足轻重的地位 本文将详细探讨会议设备的重要性 以及如何选择和使用合适的会议设备 以实现高效 顺畅的沟通 首先
  • 语音翻译软件app哪家好?帮你和外国人无碍交流的软件分享

    在和外国人交流的时候发现听不懂怎么办 还能怎么办 谁让我们的英语没学好呢 这种时候还是得寻求其他人的帮助 不过万一要是在只有你一个人的情况下又怎么办呢 俗话说 求人不如求己 那还是得在自己手机里时刻准备好能够翻译英语的工具呀 今天就给大家分
  • 一文让你了解UI自动化测试

    测试都起什么作用 是项目的保险 但不是项目的救命草 测试无实际产出 但作用远大于实际产出 测试是从项目维度保证质量 而不是测试阶段 UI自动化 下面简称自动化 基于UI进行自动功能测试 以Web端作为例子 一般的UI功能自动化都是基于HTM
  • 外包干了2个月,技术倒退2年。。。

    先说一下自己的情况 本科生 20年通过校招进入深圳某软件公司 干了接近4年的 功能测试 今年国庆 感觉自己不能够在这样下去了 长时间呆在一个舒适的环境会让一个人堕落 而我已经在一个企业干了四年的功能测试 已经让我变得不思进取 谈了3年的女朋
  • C# Break 和 Continue 语句以及数组详解

    C Break 它被用于 跳出 switch 语句 break 语句也可用于跳出循环 以下示例在 i 等于 4 时跳出循环 示例 for int i 0 i lt 10 i if i 4 break Console WriteLine i
  • 深入解析 YAML 配置文件:从语法到最佳实践

    一 认识YAML YAML YAML Ain t Markup Language 是一种人类可读的数据序列化语言 它的设计目标是使数据在不同编程语言之间交换和共享变得简单 YAML采用了一种简洁 直观的语法 以易于阅读和编写的方式表示数据结
  • 用Python实现高效数据记录!Web自动化技术助你告别重复劳动!

    自动化关键数据记录 简介 关键数据记录是 Web 自动化测试中的关键部分 它们提供了关于系统行为和执行过程的详细信息 有助于验证用例的正确性 排查问题和确保应用程序的质量 行为日志 行为日志是一种用于记录系统或应用程序的操作和事件的技术 它

随机推荐

  • Nginx做反向代理和负载均衡时“X-Forwarded-For”信息头的处理

    一 概述 如今利用nginx做反向代理和负载均衡的实例已经很多了 针对不同的应用场合 还有很多需要注意的地方 本文要说的就是在通过CDN后到达nginx做反向代理和负载均衡时请求头中的 X Forwarded For 项到底发生了什么变化
  • 电脑电池,我的笔记本电脑的电池为什么一直没电

    凡是电池都是有个使用寿命的 笔记本电池的寿命可是按照充放电的次数来计算的 但很多人对这个问题并不十分了解 加上一般笔记本电池的充放电次数起码也在500次左右 以至于很多朋友都认为笔记本电池的寿命也就是两年左右 笔记本电池即使不用 也会有自放
  • pyTorch中tensor运算

    文章目录 PyTorch的简介 PyTorch中主要的包 PyTorch的安装 使用GPU的原因 使数据在GPU上运行 什么使Tensor 张量 一些术语介绍 Tensor的属性介绍 Rank axis shape Rank Axis 轴
  • 离散引擎仿真基础

    1 简答题 Q 解释 游戏对象 GameObjects 和 资源 Assets 的区别与联系 区别 游戏对象 是Unity中的基本对象 游戏中的每个对象都是游戏对象 可以表现为人物 道具 场景等等 它们本身并不能完成很多工作 但它们的主要作
  • LeetCode(力扣)1005. K 次取反后最大化的数组和Python

    LeetCode1005 K 次取反后最大化的数组和 题目链接 代码 题目链接 https leetcode cn problems maximize sum of array after k negations 代码 class Solu
  • GPT-4只是AGI的火花?LLM终将退场,世界模型才是未来

    来源 新智元报道 编辑 润 Lumina 导读 人类距离AGI还有多远 也许大语言模型不是最终答案 一个理解世界的模型才是未来的方向 在人类的认知之中 似乎早已习惯将通用人工智能 AGI 设定为人工智能的终极形态和发展的最终目标 虽然Ope
  • python实现SHA256

    from hashlib import sha256 import hmac def get sign key data sha256加密有2种 hsobj sha256 key encode utf 8 hsobj update data
  • 基于51 手机遥控的蓝牙小车(HC-05)

    文章目录 一 软件 手机下载 蓝牙串口 电脑下载 XCOM串口调试助手 二 硬件 HC 05模块 USB转TTL模块 51小车 1 HC 05 2 USB转TTL模块 三 调试 1 引脚连接 2 进入AT模式 3 手机端串口助手的调试 4
  • C#——ref

    C ref ref 关键字指示按引用传递的值 它用在四种不同的上下文中 1 在方法签名和方法调用中 按引用将参数传递给方法 2 在方法签名中 按引用将值返回给调用方 3 在成员正文中 指示引用返回值是否作为调用方欲修改的引用被存储在本地 或
  • 发邮件向论文作者卑微求代码模板

    记录本人第一封卑微邮件 肯定不是最后一封 主题 关于XXX 随机Petri网 的实现问题 question regarding XXX the implementation of stochastic Petri nets 正文 中文版本
  • 交叉路口红绿灯控制程序linux,西门子PLC编程实例详解|十字路口交通灯自动控制系统...

    原标题 西门子PLC编程实例详解 十字路口交通灯自动控制系统 知识点和关键字 定时器 触点比较指令 传送指令 变址应用 数据块 控制要求 示意图 时序图 工艺流程图 当该路口是红灯时 另外一个路口是通行时间 绿灯亮和黄灯闪亮 当另外一个路口
  • 华为5g测试软件probe_【简讯】华为自研超高速sfs闪存曝光;苹果宣布11月10日举行新品发布会…...

    苹果宣布11月10日举行新品发布会 今天 苹果终于对外宣布 将在美国时间11月10举行新品线上发布会 而本次发布会的主题是 One more thing 至于这次发布会会带来什么新品 目前还不清楚 不过之前库克 Tim Cook 已经曝光
  • Tomcat的安装配置与使用,及常用端口大全

    如果有兴趣了解更多相关知识 可以来我的个人博客看看 eyes 的个人空间 零 Tomcat的介绍 Tomcat是Apache 软件基金会的Jakarta 项目中的一个核心项目 由Apache Sun 和其他一些公司及个人共同开发而成 由于有
  • NDK Android平台openSLES音频采集和播放

    Android平台使用openSLES采集麦克风音频代码实现 链接 https edu csdn net learn 38258 606150 spm 1003 2001 3001 4157 Android平台使用openSLES播放PCM
  • 记一次elasticSearch同步数据失败:blocked by: [FORBIDDEN/12/index read-only / allow delete (api)]

    记一次elasticSearch同步数据失败的原因 报错内容 org elasticsearch cluster block ClusterBlockException blocked by FORBIDDEN 12 index read
  • 晶振PCB layout注意事项

    晶振 想必大家都了解 为系统提供时钟的基本信号的一种器件 在电路设计尤其是手机电路设计时并不是很复杂 但是一旦到了后期调试时 却往往会发现 晶振带来的问题却不少 其实 一个良好的layout 可以让晶振少为项目带来点麻烦 所以呢 借此讲一讲
  • 用OpenCV的SVM实现简单的手势识别(切水果)[附源码]

    基于HOG特征的SVM分类器实现 在机器学习领域 支持向量机SVM Support Vector Machine 是一个有监督的学习模型 通常用来进行模式识别 分类 以及回归分析 方向梯度直方图 Histogram of Oriented
  • conda create --name python34 python=3.4

    当在命令行输入conda create name python34 python 3 4时出现以下报错 这是因为python3 4已被弃用 我们输入如下指令可查看当前可以安装的版本 conda search python 然后输入对应的版本
  • 内容策划:如何起草一份技术服务条款及相关声明?

    你以为 只要产品过硬就可以了吗 不 还需要好的服务保驾护航 对于面向企业用户的定制产品 通常由专职的售前工程师 进行对接 并以合同约定为准 实施售后服务 对于通用型产品而言 则很难进行有针对性的1对1服务 但服务同样很重要 所以就需要通过服
  • 软件测试十年老鸟——分享学习实战经验,看完直呼窝靠

    前言 作为软件开发过程中一个非常重要的环节 软件测试越来越成为软件开发商和用户关注的焦点 完善的测试是软件质量的保证 因此软件测试就成了一项重要而艰巨的工作 要做好这项工作当然也绝非易事 下面我着重谈谈自己在做软件测试工作中总结出来的一些经