程序员不会告诉老板的那些神器

目录

1. 持续集成工具:CruiseControl(简称CC)

2. 代码风格、质量检查工具:StyleCop

3.AI工具

3.1  AI助力编写开发日报

3.2  AI助力编写普适性代码

3.3  AI助力生成代码注释

3.4 AI助力重构代码去掉“坏味道”

3.5  AI助力完成伪代码流程

3.6 AI助力编写测试用例


作为一名程序员,大家总有一些“小秘密”是不想让老板知道的,尤其是那些能够让我们在工作中“摸鱼”或是提高效率的神器。当然,这些并不是为了偷懒,而是为了更好地管理我们的工作流程,提升代码质量,甚至是在繁忙的工作中找到一丝乐趣。下面,就让我来揭秘这些程序员们私藏的神器吧!
 

摸鱼神器:韭菜盒子

说起这个工具,懂的都懂-_-||b 经济大环境发展趋缓,你不得给自己额外”创收“?比如你是否曾在工作时想要偷偷关注一下股市动态,却又怕被老板发现?回忆19年,”超跌“让我买车的预算从A6L直接下滑到A4,这说起来都是眼泪啊(此处省略1000字)。跑题了,还是回来说咱的神器:让“韭菜盒子”来帮你及时了解股票基金的涨跌情况吧!这款VSCode插件不仅可以让你在编写代码的同时,实时查看投资情况,还提供了资金走向、基金历史净值查看等功能。这样一来,你在编写代码的同时,也能随时掌握市场动态,一举两得!

注意这个摸鱼神器帮助你赚钱了,你可以不告诉我,所以如果你在错误的时间有了错误的操作,出了问题也别说我让你干的 哈哈

以上就是程序员们不会告诉老板的那些神器啦!当然了,使用这些神器的目的是为了更好地完成工作,提高工作效率。如果你也想成为一名高效的程序员,不妨试试这些神器吧!

下面说点儿正经程序员神器吧:

1. 持续集成工具:CruiseControl(简称CC)

CruiseControl是一款强大的持续集成工具,它可以帮助团队自动感知代码变化,并进行持续集成。最初我在公司的TFS中将其集成,通过它,各位项目经理可以及时获取代码构建报告(我们要求开发库每天必须提交代码),并通过Email、Jabber等方式得到通知。这样一来,代码审核人员就可以在第一时间发现并解决代码中的问题,提高开发效率。更重要的是,CruiseControl的平台核心非常小,但扩展性非常强,可以根据自己的需求进行定制。

2. 代码风格、质量检查工具:StyleCop

最早接触StyleCorp是在微软的VS这个IDE中,当时也是尝试让团队的代码编写更规范(主要是交接时更简单),引入了两款工具,一个是FxCop,另一个是StyleCop.Analyzer。后来接触了StyleCop。这是一款开源的代码规范检查工具,它不仅可以检查代码的格式,还能检查编码规范,包括命名、注释等。通过StyleCop,团队可以轻松确保代码的可读性和可维护性,提高代码质量。更重要的是,StyleCop的规则可以自定义,我们根据公司的开发规范开发了许多自定义的检查规则,也可以根据自己的项目需求来设定规则,屏蔽不适用的规则。这样一来,就可以更加灵活地管理你的代码库,提高开发效率。

3.AI工具

这其实才是我要重点说的-_-||b

在当今这个信息爆炸的时代,程序员面临着前所未有的挑战。项目的复杂度不断增加,而交付周期却日益缩短。幸运的是,随着人工智能技术的飞速发展,特别是大模型AI的崛起,我们有了新的方法来应对这些挑战。下面,我将详细介绍程序员如何利用大模型AI在软件开发过程中的多个环节实现工作效率的显著提升。

3.1  AI助力编写开发日报

在软件开发过程中,记录每天的开发进展和代码改动是至关重要的。然而,手动编写开发卷宗既耗时又容易出错。通过将每天开发的代码发送给AI,我们可以利用其强大的自然语言处理和文本生成能力,自动提炼和记录代码变更、完成任务的情况,从而生成详细的开发卷宗。这不仅节省了程序员的时间,还提高了日报的准确性和完整性。

比如根据一段代码(代码参考3.2),我让AI完成了如下开发日报:

开发日报

日期:[填写日期]

项目名称: 文件加密工具

开发者:[填写姓名]

今日工作概述

  1. 完成了文件加密解密工具的核心功能开发
    • 设计并实现了一个名为FileEncryptor的静态类,用于处理文件的加密和解密操作。
    • 实现了EncryptFileAsyncDecryptFileAsync两个异步方法,分别用于加密和解密文件。
    • 使用了AES加密算法,并通过PBKDF2算法从预定义密码中派生出安全的密钥。
    • 添加了迭代次数、盐值等安全特性以增强加密强度。

详细工作内容

  • 加密功能
    • 编写了GenerateSalt方法来生成随机盐值。
    • 编写了GenerateKey方法,使用PBKDF2算法从预定义密码中派生出AES密钥。
    • 实现了WriteHeaderAsync方法,用于在加密文件的开头写入盐值和加密算法信息。
    • 实现了EncryptStreamAsync方法,用于读取输入流,加密数据,并将加密后的数据写入输出流。
  • 解密功能
    • 实现了ReadHeaderAsync方法,用于从加密文件中读取盐值和加密算法信息,并据此初始化AES解密器。
    • 实现了DecryptStreamAsync方法,用于读取加密数据,解密数据,并将解密后的数据写入输出流。

遇到的问题与解决方案

  • 问题1: 在实现ReadHeaderAsync方法时,未设置AES解密器的Padding属性,导致解密时可能抛出异常。
    解决方案: 在初始化AES解密器时,设置了Padding属性为PaddingMode.PKCS7

  • 问题2: 初始实现中,GenerateKey方法直接使用UTF-8编码将密码转换为字节数组,这不够安全。
    解决方案: 改用PBKDF2算法从密码中派生出安全的密钥。

明日工作计划

  1. 对代码进行单元测试和集成测试,确保加密解密功能的正确性。
  2. 优化代码性能,特别是加密解密过程中的内存使用和I/O操作。
  3. 完善用户交互界面,使工具更加易用。
  4. 编写用户手册和部署文档,方便用户部署和使用工具。

备注

  • 今天的工作主要集中在实现核心功能上,明天将着重于测试和性能优化。
  • 如有需要,请及时与我沟通

怎么样,这份日报(工作日志)格式严谨、内容充实,看着还像那么回事吧!如果你头疼每天必须写日志,不妨把代码发给AI,让它帮你完成,你也好继续“摸鱼”,或者继续为开源社区做贡献去。

3.2  AI助力编写普适性代码

编写高效且健壮的通用算法是程序员的日常工作之一,但这也是一项复杂且耗时的任务。大模型AI能够快速分析和理解大量代码库,为程序员提供经过优化的算法模板或代码片段,从而加速通用算法的开发过程。比如下面我曾在项目中需要对某一临时数据在终端落地,但考虑安全性时,想到需要进行数据加密保存,于是我借助ChatGPT完成了这个功能:

using System;
using System.IO;
using System.Security.Cryptography;
using System.Threading.Tasks;namespace FileEncryption
{public static class FileEncryptor{// 设置密码private const string Password = "20220304_DJZC";// 设置加密迭代次数private const int Iterations = 1000;public static async Task EncryptFileAsync(string inputFile, string outputFile){// 生成随机盐值byte[] salt = GenerateSalt();// 创建 AES 加密器AesCryptoServiceProvider aes = new AesCryptoServiceProvider();aes.KeySize = 256;aes.BlockSize = 128;aes.Key = GenerateKey();aes.IV = salt;aes.Mode = CipherMode.CBC;// 创建加密流using (FileStream input = new FileStream(inputFile, FileMode.Open))using (FileStream output = new FileStream(outputFile, FileMode.Create))using (BufferedStream bufferedInput = new BufferedStream(input))using (BufferedStream bufferedOutput = new BufferedStream(output))using (ICryptoTransform encryptor = aes.CreateEncryptor()){// 写入盐值和加密算法信息await WriteHeaderAsync(bufferedOutput, salt, aes.KeySize, aes.BlockSize, Iterations);// 开始加密await EncryptStreamAsync(bufferedInput, bufferedOutput, encryptor);}}public static async Task DecryptFileAsync(string inputFile, string outputFile){// 创建解密流using (FileStream input = new FileStream(inputFile, FileMode.Open))using (FileStream output = new FileStream(outputFile, FileMode.Create))using (BufferedStream bufferedInput = new BufferedStream(input))using (BufferedStream bufferedOutput = new BufferedStream(output)){// 读取加密算法信息AesCryptoServiceProvider aes = new AesCryptoServiceProvider();await ReadHeaderAsync(bufferedInput);// 创建解密器using (ICryptoTransform decryptor = aes.CreateDecryptor()){// 开始解密await DecryptStreamAsync(bufferedInput, bufferedOutput, decryptor);}}}private static byte[] GenerateSalt(){byte[] salt = new byte[16];using (RandomNumberGenerator rng = RandomNumberGenerator.Create()){rng.GetBytes(salt);}return salt;}private static byte[] GenerateKey(){// 将密码转换为字节数组//byte[] passwordBytes = System.Text.Encoding.UTF8.GetBytes(Password);// HMACSHA256 算法可以用于从密码中派生出安全的密钥var pbkdf2 = new Rfc2898DeriveBytes(Password, 16, Iterations);return pbkdf2.GetBytes(32); // 返回一个 32 字节的 AES 密钥}private static async Task WriteHeaderAsync(Stream output, byte[] salt, int keySize, int blockSize, int iterations){// 写入盐值await output.WriteAsync(salt, 0, salt.Length);// 写入加密算法信息await output.WriteAsync(BitConverter.GetBytes(keySize), 0, sizeof(int));await output.WriteAsync(BitConverter.GetBytes(blockSize), 0, sizeof(int));await output.WriteAsync(BitConverter.GetBytes(iterations), 0, sizeof(int));}private static async Task ReadHeaderAsync(Stream input){// 读取盐值byte[] salt = new byte[16];await input.ReadAsync(salt, 0, salt.Length);// 读取加密算法信息byte[] keySizeBytes = new byte[sizeof(int)];await input.ReadAsync(keySizeBytes, 0, keySizeBytes.Length);int keySize = BitConverter.ToInt32(keySizeBytes, 0);byte[] blockSizeBytes = new byte[sizeof(int)];await input.ReadAsync(blockSizeBytes, 0, blockSizeBytes.Length);int blockSize = BitConverter.ToInt32(blockSizeBytes, 0);byte[] iterationsBytes = new byte[sizeof(int)];await input.ReadAsync(iterationsBytes, 0, iterationsBytes.Length);int iterations = BitConverter.ToInt32(iterationsBytes, 0);// 创建 AES 解密器AesCryptoServiceProvider aes = new AesCryptoServiceProvider();aes.KeySize = keySize;aes.BlockSize = blockSize;aes.IV = salt;aes.Mode = CipherMode.CBC;aes.Padding = PaddingMode.PKCS7;// 生成密钥aes.Key = GenerateKey();return;}private static async Task EncryptStreamAsync(Stream input, Stream output, ICryptoTransform encryptor){byte[] buffer = new byte[8192];int bytesRead;while ((bytesRead = await input.ReadAsync(buffer, 0, buffer.Length)) > 0){// 加密数据并写入输出流byte[] encrypted = encryptor.TransformFinalBlock(buffer, 0, bytesRead);await output.WriteAsync(encrypted, 0, encrypted.Length);}}private static async Task DecryptStreamAsync(Stream input, Stream output, ICryptoTransform decryptor){byte[] buffer = new byte[8192];int bytesRead;while ((bytesRead = await input.ReadAsync(buffer, 0, buffer.Length)) > 0){// 解密数据并写入输出流byte[] decrypted = decryptor.TransformFinalBlock(buffer, 0, bytesRead);await output.WriteAsync(decrypted, 0, decrypted.Length);}}}
}

注:AI生成代码还是有些问题的,部分时候需要你多次对话才可完成,并且得到期望的代码后,还是得适当修改才可以。

3.3  AI助力生成代码注释

良好的代码注释对于代码的可读性和可维护性至关重要。然而,编写详尽的注释同样是一项繁琐的工作。AI可以根据代码的结构和逻辑,自动生成准确且清晰的注释,极大地提高了代码的可读性,同时减轻了程序员的负担。

比如下面的代码被AI添加了注释:
 

/// <summary>  
/// 根据给定的灰度图像和y坐标范围,找到人脸的ABS X坐标。  
/// </summary>  
/// <param name="imgSrc">源灰度图像</param>  
/// <param name="y1">Y坐标范围的起始值</param>  
/// <param name="y2">Y坐标范围的结束值</param>  
/// <param name="faceX">输出的人脸ABS X坐标</param>  
/// <param name="isLeft">如果为真,则从左侧开始查找;否则从右侧开始</param>  
private void GetFaceABSFaceX(Image<Gray, Byte> imgSrc, int y1, int y2, out int faceX, bool isLeft)  
{  // 将源图像二值化,并保存为新的灰度图像  Image<Gray, byte> imgThreshold = imgSrc.ThresholdBinary(new Gray(0.1d), new Gray(255d));  double iTotal = 0.0, iLoc = 0;  // 用于统计像素数量和记录位置  // 定义遍历方向,如果isLeft为真则从左到右,否则从右到左  int step = isLeft ? 1 : -1;  // 定义起始位置,如果isLeft为真则从0开始,否则从imgThreshold.Width - 1开始  int startIndex = isLeft ? 0 : imgThreshold.Width - 1;  // 遍历图像,查找人脸边界  for (int i = startIndex; isLeft ? i < imgThreshold.Width / 2 : i > imgThreshold.Width / 2; i += step)  {  iTotal = 0;  // 重置当前列的像素统计数量  // 遍历给定的y坐标范围,统计当前列的白色像素数量  for (int j = y1; j < y2; j++)  {  if (imgThreshold[j, i].Intensity != 0) // 使用Emgu CV的索引器访问像素值,更加简洁  {  iTotal++;  // 如果像素值不为0(白色),则增加计数  }  }  // 计算当前列白色像素的占比  double r = iTotal * 1.0d / ((y2 - y1) * 1.0d);  // 如果白色像素占比超过50%,则认为找到了人脸边界,记录位置并退出循环  if (r > 0.5)  {  iLoc = i;  break;  }  }  // 将找到的人脸边界位置转换为整数,并输出  faceX = Convert.ToInt32(iLoc);  // 释放二值化图像占用的资源  imgThreshold.Dispose();  
}

这个能力,对于那些懒得写注释,代码“一片荒漠”的兄弟来说,绝对是福音啊!你要做的只需把代码发给AI即可。后续每周的代码Review时,团队成员看着“足够绿化”的代码,那时的你绝对是会场上那个“最靓的仔”。不夸张地说:用来“泡”新来的实习小姐姐足够了哈哦~

3.4 AI助力重构代码去掉“坏味道”

AI在代码重构中的应用,无疑是程序员们提升工作效率的神器。通过智能分析和优化,AI工具能够迅速识别代码中的潜在问题,提出精准的重构建议,从而显著提升代码质量、统一代码风格,并自动化完成测试工作。随着AI技术的不断进步,这些工具在支持更复杂重构任务、集成更多开发工具方面的能力也将不断增强,为程序员们带来更加高效、智能的开发体验。

比如一段有“坏味道”的代码如下:
 

            if (isLeft){for (int i = 0; i < imgThreshold.Width / 2; i++){iTotal = 0;for (int j = y1; j < y2; j++){if (CvInvoke.cvGet2D(imgThreshold.Ptr, j, i).v0 != 0)iTotal++;}double r = iTotal *1.0d / ((y2 - y1) *1.0d);if (r > 0.5){iLoc = i;break;}}}else{for (int i = imgThreshold.Width - 1; i > imgThreshold.Width / 2; i--){iTotal = 0;for (int j = y1; j < y2; j++){if (CvInvoke.cvGet2D(imgThreshold.Ptr, j, i).v0 != 0)iTotal++;}double r = iTotal * 1.0d / ((y2 - y1) * 1.0d);if (r > 0.5){iLoc = i;break;}}}

经AI重构后:

// 定义遍历方向,如果isLeft为真则从左到右,否则从右到左  int step = isLeft ? 1 : -1;  // 定义起始位置,如果isLeft为真则从0开始,否则从imgThreshold.Width - 1开始  int startIndex = isLeft ? 0 : imgThreshold.Width - 1;  // 遍历图像  for (int i = startIndex; isLeft ? i < imgThreshold.Width / 2 : i > imgThreshold.Width / 2; i += step)  {  iTotal = 0;  for (int j = y1; j < y2; j++)  {  if (imgThreshold[j, i].Intensity != 0) // 使用Emgu CV的索引器访问像素值,更加简洁  iTotal++;  }  double r = iTotal * 1.0d / ((y2 - y1) * 1.0d);  if (r > 0.5)  {  iLoc = i;  break;  }  }  

注意:由于AI目前对于多态、继承等面向对象的理解能力问题,还没办法较好的从更好的维度对代码进行重构,但是可以用来消除重复代码,这对于那些习惯于“C/V大法”的程序员来说,是一个较好的助力。

3.5  AI助力完成伪代码流程

在编写复杂算法或系统之前,创建伪代码流程是一个很好的习惯。AI能够快速生成逻辑清晰、结构合理的伪代码,帮助程序员更快地规划和设计代码结构,减少开发过程中的错误和返工。

比如,我给了AI一段关于伪代码任务书的编写要求:

你是一个项目经理,需要为程序员安排一个任务,任务主题是编写一段基于人正面上半身免冠照片裁剪出证件照片的功能。你期望按如下步骤进行实现:
1.进行图像尺寸的归一化;2.二值化图像;3.人脸检测及边缘检测;4.根据证件照片的脸宽、头高、边距、眼距等要求进行裁剪坐标计算;5.裁剪照片;6.图片美化;7.dpi统一300dpi,8统一格式输出图片。注意你要将上面的逻辑编写成带有伪代码的任务书

AI生成了任务书如下:

证件照片裁剪功能任务书

一、任务目标

本任务旨在开发一个能够根据给定的人正面上半身免冠照片,自动裁剪出符合证件照片要求的照片,并进行必要的图片处理和格式统一。

二、功能流程

1. 图像尺寸归一化

  • 读取原始图像。
  • 将图像缩放到一个统一的尺寸(如 800x600 像素),以便于后续处理。
function normalizeImage(imagePath):
read image from imagePath
resize image to standard size (e.g., 800x600)
return resizedImage

2. 二值化图像

  • 将归一化后的图像进行二值化处理,便于边缘检测和人脸特征识别。
function binarizeImage(normalizedImage):
apply binary threshold to normalizedImage
return binarizedImage

3. 人脸检测及边缘检测

  • 使用人脸检测算法(如Haar Cascade、Dlib等)在二值化图像中检测人脸。
  • 进行边缘检测,以辅助确定人脸轮廓。
function detectFace(binarizedImage):
use face detection algorithm to find face region
perform edge detection on face region
return faceRegion, edgeData

4. 裁剪坐标计算

  • 根据证件照片的要求(脸宽、头高、边距、眼距等),结合检测到的人脸区域和边缘信息,计算裁剪坐标。
function calculateCropCoordinates(faceRegion, edgeData, requirements):
calculate crop coordinates based on faceRegion, edgeData, and requirements
return cropX, cropY, cropWidth, cropHeight

5. 裁剪照片

  • 使用计算出的裁剪坐标对原始图像进行裁剪。
function cropImage(originalImage, cropX, cropY, cropWidth, cropHeight):
crop originalImage based on the given coordinates
return croppedImage

6. 图片美化

  • 对裁剪后的照片进行必要的美化处理,如亮度调整、对比度增强、锐化等。
function beautifyImage(croppedImage):
apply image enhancement techniques (e.g., brightness adjustment, contrast enhancement, sharpening)
return beautifiedImage

7. DPI统一为300dpi

  • 将美化后的图像DPI(每英寸点数)统一调整为300dpi,以满足证件照片的要求。
function adjustDPI(beautifiedImage, targetDPI=300):
change DPI of beautifiedImage to targetDPI
return imageWithTargetDPI

8. 统一格式输出图片

  • 将处理后的图像保存为统一的格式(如JPEG),并指定文件名和保存路径。
function saveImage(imageWithTargetDPI, outputPath, outputFormat="JPEG"):
save imageWithTargetDPI to outputPath with the specified outputFormat
return savedImagePath

三、注意事项

  • 确保所选的人脸检测算法对多种光照条件和人脸角度具有鲁棒性。
  • 在进行图片美化时,应保持图像的自然度和真实性,避免过度处理。
  • 在调整DPI时,要注意保持图像的清晰度和比例。
  • 统一输出格式时,应考虑图像质量和文件大小的平衡。

四、开发要求

  • 请按照上述功能流程进行开发,确保每个步骤的正确性和高效性。
  • 在开发过程中,应注重代码的可读性和可维护性。
  • 完成后,请提供详细的测试报告和示例输出图像。

3.6 AI助力编写测试用例

测试是软件开发中不可或缺的一环,但编写全面的测试用例同样是一项艰巨的任务。AI可以根据代码的结构和功能,自动生成相应的测试用例,确保代码的健壮性和稳定性,同时节省了程序员大量的时间和精力。

比如有如下代码:
 

        private int GetFitArea(Control control, string str, out SizeF size){int fontInitSize = 80;  //根据测试目前界面上的PictureBox适合的字体大小为76,此处由大到小循环计算using (System.Drawing.Graphics g = control.CreateGraphics()){// 获得一个Graphics实例int margin = 10;         //边距,对于多字组成的词语输出时有用using (FontFamily fontFamily = new System.Drawing.FontFamily(theme.FontName)){using (System.Drawing.Font font = new System.Drawing.Font(fontFamily, fontInitSize)){size = g.MeasureString(str, font);}while (((control.Size.Width - size.Width) < margin) || ((control.Size.Height - size.Height) < margin))    //循环计算合适的大小{fontInitSize--;using (System.Drawing.Font font = new System.Drawing.Font(fontFamily, fontInitSize)){size = g.MeasureString(str, font);  // 计算字符串所需要的大小}}}}return fontInitSize - 1;}

你可以让AI生成测试用例的代码如下:
 

using Microsoft.VisualStudio.TestTools.UnitTesting;  
using System;  
using System.Drawing;  
using System.Windows.Forms;  // 假设你的GetFitArea方法在某个类中,比如名为GraphicsHelper  
[TestClass]  
public class GraphicsHelperTest  
{  [TestMethod]  public void TestGetFitAreaWithLongString()  {  // 创建一个模拟的Control对象,并设置其大小  Control control = new Control();  control.Size = new Size(200, 100); // 假设控制的大小是200x100像素  // 调用被测试的方法,并传入一个较长的字符串  string testStr = "This is a relatively long string to test the fitting area.";  SizeF measuredSize;  int fontSize = new GraphicsHelper().GetFitArea(control, testStr, out measuredSize);  // 断言字体大小是否在预期范围内(这个范围需要根据实际情况调整)  Assert.IsTrue(fontSize > 0 && fontSize < 80, "Font size should be between 1 and 79.");  // 可以添加更多的断言来验证measuredSize是否符合预期,比如是否小于control的大小等。  }  [TestMethod]  public void TestGetFitAreaWithShortString()  {  // 创建一个模拟的Control对象,并设置其大小  Control control = new Control();  control.Size = new Size(200, 100); // 假设控制的大小是200x100像素  // 调用被测试的方法,并传入一个较短的字符串  string testStr = "Hi!";  SizeF measuredSize;  int fontSize = new GraphicsHelper().GetFitArea(control, testStr, out measuredSize);  // 对于短字符串,字体大小应该接近初始设定的最大值(比如70左右,具体数值需要根据实际情况调整)  Assert.IsTrue(fontSize > 70, "Font size should be greater than 70 for a short string.");  // 可以添加更多的断言来验证measuredSize是否符合预期。  }  
}  

另外,作为QC的小伙伴别着急,你可以将上面的原始代码发给AI,要求他给你出一个专业、美观的测试用例表,这也是没问题的:

测试用例表格

测试用例编号测试用例名称测试目标测试准备测试步骤预期结果测试结果测试结论
TC001测试长字符串在控件中的适配情况确保GetFitArea方法能够准确计算出长字符串在指定控件中的最佳字体大小1. 创建一个尺寸为200x100像素的Control对象1. 向GetFitArea方法传入一个长字符串1. 返回的字体大小应在1至79之间☐ 通过 ☐ 失败
2. 设定长字符串内容2. 验证返回的measuredSize与Control对象尺寸的关系2. measuredSize的宽度和高度均应小于或等于Control对象的对应尺寸
TC002测试短字符串在控件中的适配情况确保GetFitArea方法能够准确计算出短字符串在指定控件中的最佳字体大小1. 创建一个尺寸为200x100像素的Control对象1. 向GetFitArea方法传入一个短字符串1. 返回的字体大小应大于70☐ 通过 ☐ 失败
2. 设定短字符串内容2. 验证返回的measuredSize与Control对象尺寸的关系2. measuredSize的宽度和高度均应在Control对象尺寸范围内

测试执行记录

测试执行人:__________________

测试执行日期:__________________

测试环境描述:______________________________________

备注:

  1. 测试准备中提到的“长字符串”和“短字符串”应事先定义好,并在测试步骤中明确指出其内容。

  2. 在“测试结果”一栏中,填写实际返回的字体大小和measuredSize值。

  3. 根据实际测试结果,在“测试结论”一栏中勾选相应的选项(通过或失败)。

  4. 如测试失败,请详细描述失败原因,并考虑是否需要重新设计测试用例或修改被测试的代码。

怎么样,上面的表格完全是AI根据待测试的代码生成的,专业性还不错哦~

总结一下:AI在软件开发过程中的应用,越来越能显著提高程序员的工作效率,减少错误和返工,让程序员能够更专注于创新和解决复杂问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/9046.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【小白的大模型之路】基础篇:Transformer细节

基础篇&#xff1a;Transformer 引言模型基础架构原论文架构图EmbeddingPostional EncodingMulti-Head AttentionLayerNormEncoderDecoder其他 引言 此文作者本身对transformer有一些基础的了解,此处主要用于记录一些关于transformer模型的细节部分用于进一步理解其具体的实现机…

渗透之sql注入---宽字节注入

目录 宽字节注入原理&#xff1a; 实战&#xff1a; 源码分析&#xff1a; 开始注入&#xff1a; 找注入点&#xff1a; 注入数据库名&#xff1a; 注入表名&#xff1a; 注入列明&#xff1a; 注入具体值&#xff1a;http://sqli-labs:8084/less-32/?id-1%df%27unio…

luceda ipkiss教程 66:金属线的钝角转弯

案例分享&#xff1a;金属线的135度转弯&#xff1a; 所有代码如下&#xff1a; from si_fab import all as pdk import ipkiss3.all as i3 from ipkiss.geometry.shape_modifier import __ShapeModifierAutoOpenClosed__ from numpy import sqrtclass ShapeManhattanStub(__…

《ESP8266通信指南》11-Lua开发环境配置

往期 《ESP8266通信指南》10-MQTT通信&#xff08;Arduino开发&#xff09;-CSDN博客 《ESP8266通信指南》9-TCP通信&#xff08;Arudino开发&#xff09;-CSDN博客 《ESP8266通信指南》8-连接WIFI&#xff08;Arduino开发&#xff09;&#xff08;非常简单&#xff09;-CSD…

短信公司_供应群发短信公司

短信公司——供应群发短信公司 短信公司作为一种为企业提供群发短信服务的服务商&#xff0c;正逐渐受到市场的青睐。供应群发短信公司作为其中的一种类型&#xff0c;为各行各业的企业提供高效、便捷的短信推广渠道。本文将介绍短信公司的作用以及供应群发短信公司的特点和优势…

Django之创建Model以及后台管理

一&#xff0c;创建项目App python manage.py startapp App 二&#xff0c;在App.models.py中创建类&#xff0c;以下是示例 class UserModel(models.Model):uid models.AutoField(primary_keyTrue, auto_createdTrue)name models.CharField(max_length10, uniqueTrue, db…

ICode国际青少年编程竞赛- Python-2级训练场-坐标与列表练习

ICode国际青少年编程竞赛- Python-2级训练场-坐标与列表练习 1、 for i in range(6):Spaceship.step(Item[i].x - Spaceship.x)Dev.step(Item[i].y - Dev.y)Dev.step(Spaceship.y - Dev.y)2、 for i in range(5):Spaceship.step(Item[i].x - Spaceship.x)Flyer[i].step(Item[…

车载测试___面试题和答案归纳

车载面试题 一、实车还在设计开发阶段&#xff0c;大部分测试通过什么测试&#xff1f; 答案&#xff1a;通过台架和仿真来完成的 二、测试部分划分&#xff1f; 测试部门是分为自研&#xff0c;系统&#xff0c;验收&#xff0c;自研部门是开发阶段测试&#xff0c;系统部门…

重发被恶意举报的主食冻干测评,速看可能再被删!PR、希喂和SC真实对比PK!

要给猫咪提供高品质主食&#xff0c;主食冻干是不二之选。主食冻干不仅含肉量高、吸收消化率高&#xff0c;还有着丰富的、普通猫粮无法提供的各类营养素&#xff0c;满足猫咪微量元素的需求。可以说是营养与生骨肉喂养媲美&#xff0c;又能完美避开生骨肉细菌超标带来的一系列…

如何优雅的实现接口限流?

首先限流&#xff0c;其实解决方案有很多&#xff0c;比如通过nginx配置&#xff0c;通过gateway网关进行限流&#xff0c;比如Spring Cloud GateWay整合熔断器实现限流 但是以上都是全局的&#xff0c;如何灵活的针对某些接口进行不同级别的限流呢&#xff1f; 方案一&#…

超标量处理器设计:重排序缓存(ROB)

★超标量处理器的很多地方用到了重排序缓存&#xff0c;但是我对它不是很了解&#xff0c;所以我整理一下重排序缓存的知识点。 重排序缓存(ROB)在确保乱序执行的指令能够正确地完成和提交(Commit)&#xff0c;也可以用来寄存器重命名。 ROB是一个先进先出的表&#xff0c;每个…

Re_Lasso

from sklearn.linear_model import LassoCV, Lasso import pandas as pd from sklearn.model_selection import train_test_split from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score from sklearn.model_selection import GridSearchCV# 读取数据…

【备战软考(嵌入式系统设计师)】10 - 软件工程基础

这一部分的内容是概念比较多&#xff0c;不要理解&#xff0c;去感受。 涉及的知识点是嵌入式系统开发和维护的部分&#xff0c;也就是和管理相关的&#xff0c;而不是具体如何进行嵌入式系统开发的细节。 系统开发生命周期 按照顺序有下面几个阶段&#xff0c;我们主要要记…

12 华三的二层链路聚合

12 华三的二层链路聚合 配置思路 1. 配置二层静态聚合组 (1) 进入系统视图。 system-view (2) 创建二层聚合接口&#xff0c;并进入二层聚合接口视图。 interface bridge-aggregation interface-number [ lite ] 创建二层聚合接口后&#xff0c;系统将自动生成…

代码随想录算法训练营DAY46|C++动态规划Part8|139.单词拆分、多重背包理论基础、背包问题总结篇

文章目录 139.单词拆分思路CPP代码 多重背包理论基础处理输入把所有个数大于1的物品展开成1个开始迭代&#xff0c;计算dp数组代码优化 背包问题总结篇 139.单词拆分 力扣题目链接 文章讲解&#xff1a;139.单词拆分 视频讲解&#xff1a;你的背包如何装满&#xff1f;| LeetCo…

计算方法实验9:Romberg积分求解速度、位移

任务 输出质点的轨迹 ( x ( t ) , y ( t ) ) , t ∈ { 0.1 , 0.2 , 0.3 , . . . , 10 } (x(t), y(t)), t\in \{0.1, 0.2, 0.3, ..., 10\} (x(t),y(t)),t∈{0.1,0.2,0.3,...,10}&#xff0c;并在二维平面中画出该轨迹.请比较M分别取4, 8, 12, 16, 20 时&#xff0c;Romberg积分达…

蓝桥杯省三爆改省二,省一到底做错了什么?

到底怎么个事 这届蓝桥杯选的软件测试赛道&#xff0c;都说选择大于努力,软件测试一不卷二不难。省赛结束&#xff0c;自己就感觉稳啦&#xff0c;全部都稳啦。没想到一出结果&#xff0c;省三&#xff0c;g了。说落差&#xff0c;是真的有一点&#xff0c;就感觉和自己预期的…

汽车软件研发工具链丨怿星科技新产品重磅发布

“创新引领未来”聚焦汽车软件新基建&#xff0c;4月27日下午&#xff0c;怿星科技2024新产品发布会在北京圆满举行&#xff01;智能汽车领域的企业代表、知名大企业负责人、投资机构代表、研究机构代表齐聚现场&#xff0c;线上直播同步开启&#xff0c;共同见证怿星科技从单点…

经典回溯算法之N皇后问题

问题描述&#xff1a; 有一个N*N的棋盘&#xff0c;需要将N个皇后放在棋盘上&#xff0c;保证棋盘的每一行每一列每一左斜列每一右斜列都最多只能有一个皇后。 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如…

Java | Leetcode Java题解之第71题简化路径

题目&#xff1a; 题解&#xff1a; class Solution {public String simplifyPath(String path) {String[] names path.split("/");Deque<String> stack new ArrayDeque<String>();for (String name : names) {if ("..".equals(name)) {if …