小编Chr*_*isW的帖子

单独的'调试'和'发布'构建?

我认为发布开发人员实际测试的软件版本会更好; 因此,我倾向于从project/makefile中删除'debug'目标,因此只有一个版本可以构建(并经过测试,调试和发布).

出于类似的原因,我不使用'断言'(参见断言总是坏的吗 ......).

一个人认为"调试"版本的原因是它更容易调试:但是,我反驳说你可能最终想要支持和调试你发布的任何东西,所以你需要建立一个版本您可以根据需要调试...这可能意味着启用调试符号,并禁用某些优化,即使在"发布"版本中也是如此.

有人说"这是个坏主意"; 这是我几年前发展起来的政策,被以下因素烧毁:

  • 一些开发人员测试他们的调试但不测试发布版本
  • 一些开发人员编写的bug只出现在发布版本中
  • 该公司在测试不充分后发布了发布版本(它是否完全足够?)
  • 被要求调试发布版本

从那时起,我看到不止一个开发商遵循这种做法(即没有单独的调试和发布版本).

你的政策是什么?

testing debugging release release-management

44
推荐指数
5
解决办法
1万
查看次数

应该测试内部实现,还是仅测试公共行为?

给定软件......

  • 该系统由几个子系统组成
  • 每个子系统由几个组件组成
  • 每个组件都使用许多类实现

...我喜欢编写每个子系统或组件的自动化测试.

我没有为组件的每个内部类编写测试(因为每个类都有助于组件的公共功能,因此可以通过组件的公共API从外部测试/测试).

当我重构组件的实现时(我经常这样做,作为添加新功能的一部分),因此我不需要改变任何现有的自动化测试:因为测试仅依赖于组件的公共API和公共API通常是扩大而不是改变.

我认为这个政策与重构测试代码这样的文件形成了鲜明的对比,后者说...

  • "......单元测试..."
  • "......系统中每个班级的测试班......"
  • "......测试代码/生产代码比率...理想地被认为接近1:1的比例......"

...所有这些我认为我不同意(或至少不练习).

我的问题是,如果你不同意我的政策,你会解释原因吗?在什么情况下这种测试程度不足?

综上所述:

  • 公共接口经过测试(并经过重新测试),很少改变(它们被添加到但很少被改变)
  • 内部API隐藏在公共API之后,可以在不重写测试公共API的测试用例的情况下进行更改

脚注:我的一些"测试用例"实际上是作为数据实现的.例如,UI的测试用例包含数据文件,其中包含各种用户输入和相应的预期系统输出.测试系统意味着拥有测试代码,该代码读取每个数据文件,将输入重放到系统中,并断言它获得相应的预期输出.

虽然我很少需要更改测试代码(因为公共API通常是添加而不是更改),但我发现有时候(例如每周两次)需要更改一些现有的数据文件.当我更好地更改系统输出(即新功能改进现有输出)时可能会发生这种情况,这可能导致现有测试"失败"(因为测试代码只会尝试断言输出没有改变).要处理这些情况,我会执行以下操作:

  • 重新运行自动化测试套件,该套件有一个特殊的运行时标志,告诉它不要断言输出,而是将新输出捕获到新目录中
  • 使用可视化差异工具查看哪些输出数据文件(即哪些测试用例)已更改,并验证这些更改是否正常并且符合新功能的预期
  • 通过将新目录中的新输出文件复制到运行测试用例的目录(覆盖旧测试)来更新现有测试

脚注:通过"组件",我的意思是"一个DLL"或"一个组件"...这个大到足以在系统的体系结构或部署图上可见,通常使用数十个或100个类实现,以及因此与公共API只包含约1或接口少数......一些可能被分配到的开发商之一的团队(其中不同的组件被分配到不同的团队),并且将根据康威定律有一个相对稳定的公共API.


脚注:文章面向对象测试:神话与现实说,

神话:黑盒测试就足够了. 如果您使用类接口或规范仔细测试测试用例设计,则可以确保该类已经完全运用.白盒测试(查看方法的实现来设计测试)违反了封装的概念.

现实:OO结构很重要,第二部分.许多研究表明,开发人员认为黑盒测试套件非常彻底,只能在测试实施中使用三分之一到一半的语句(更不用说路径或状态)了.这有三个原因.首先,选择的输入或状态通常执行正常路径,但不强制所有可能的路径/状态.其次,单独的黑盒测试无法揭示惊喜.假设我们已经测试了被测系统的所有指定行为.为了确信没有未指明的行为,我们需要知道系统的任何部分是否未被黑盒测试套件执行.获取此信息的唯一方法是通过代码检测.第三,通常很难在不检查源代码的情况下执行异常和错误处理.

我应该补充一点,我正在进行白盒功能测试:我看到了代码(在实现中),我编写了功能测试(驱动公共API)来练习各种代码分支(功能实现的细节).

refactoring integration-testing automated-tests unit-testing code-coverage

44
推荐指数
4
解决办法
1万
查看次数

为什么HTML/JavaScript/CSS不是编译语言,它们会是什么?

为什么HTML/JavaScript/CSS不会成为编译语言(甚至可能合并为一种编译语言)?如果浏览器运行"浏览器虚拟机"和html/javascript/css源可以通过编译为"浏览器字节码"怎么办?它不会对开发人员和用户有很大帮助吗?

我可以看到一些挑战:

  1. 如何处理数以万计的现有页面?使这个编译可选,所以如果你想要你可以使用普通的旧HTML.如果您想为浏览器提供已编译的页面,请使用.chtml.

  2. 搜索提供商如何索引页面?制作一个可以将字节码反编译为精确原始源的反编译器(例如像flash一样可以反编译).或者搜索提供商可以使用相同的虚拟机并从中获取所需的数据.

  3. 如何使其与所有浏览器兼容?有一个集中开发人员(比方说w3c)来开发这个虚拟机,然后每个浏览器都会嵌入它.

但是好处呢?

  1. 速度.
  2. 尺寸.
  3. 没有更多"松散"和"半正确"的HTML.它是正确的还是不会编译.
  4. 在每个(支持的)浏览器中看起来都一样.

如果不是字节码,那么至少有一些原生压缩,html可能不是最有效的数据存储方式.我知道有gzip但是为什么每次在服务器上压缩页面并在浏览器中解压缩,如果我们可以压缩一次并将其提供给浏览器?

那么是什么阻止我们走这条路(好吧,除了付出巨大努力才能实现这一切)?

html compiler-construction interpreted-language

40
推荐指数
2
解决办法
3万
查看次数

混淆的效果如何?

另一个问题,即Best .NET混淆工具/策略,询问是否使用工具轻松实现混淆.

我的问题是,混淆是否有效?在回答这个答案的评论中,有人说" 如果你担心来源被盗......混淆对于一个真正的破解者来说几乎是微不足道的 ".

我查看了Dotfuscator社区版的输出:它看起来对我来说是模糊的!我不想保持这一点!

我知道简单地"破解"混淆软件可能相对容易:因为您只需要找到软件中的任何位置即可实现您想要破解的任何位置(通常是许可证保护),并添加跳转以跳过它.

如果担心的不仅仅是最终用户或"盗版者"的破解:如果担心"来源被盗",即如果您是软件供应商,而您担心的是另一个供应商(潜在的竞争对手)逆转 - 设计你的来源,然后他们可以使用或添加到他们自己的产品......简单混淆在多大程度上是对这种风险的充分或不充分的保护?


第一次编辑:

有问题的代码大约是20个KLOC,它运行在最终用户机器上(用户控件,而不是远程服务).

如果混淆真的" 对于一个真正的破解者来说几乎是微不足道的 ",我想要了解为什么它无效(而不仅仅是"多少"它没有效果).


第二次编辑:

我并不担心某人正在改变算法:更担心他们将算法的实际实现(即源代码)重新用于他们自己的产品.

确定20个KLOC是几个月的开发工作,是否需要多于或少于这个(几个月)对其进行反混淆处理?

甚至有必要对某些东西进行反混淆以便"窃取"它:或者一个理智的竞争者可能只是将它批量地整合到他们的产品中,同时仍然混淆,接受它是一个维护噩梦,并希望它几乎不需要维护?如果这种情况可能的,那么混淆.Net代码比编译的机器代码更容易受到这种影响吗?

大多数混淆"军备竞赛"的主要目的是阻止人们甚至"破解"某些东西(例如查找和删除实施许可保护/执法的代码片段),而不是防止"来源盗窃"?

.net obfuscation protection

30
推荐指数
4
解决办法
8035
查看次数

display:block inside display:inline

我想了解当CSS所在的元素是CSS的元素的display:blockDOM子元素时会发生什么display:inline(因此块元素是内联元素的子元素).

CSS 2.1规范的匿名块框部分描述了这种情况:该示例包括以下规则......

body { display: inline }
p    { display: block }
Run Code Online (Sandbox Code Playgroud)

......以及附带的文字说......

BODY元素包含匿名文本的块(C1),后跟块级元素,后跟另一个匿名文本块(C2).生成的框将是BODY周围的匿名块框,包含C1周围的匿名块框,P块框和C2周围的另一个匿名块框.

如果你有一个display:inline父元素,并且如果这个父元素有一个子元素,那么这个子元素display:block的存在似乎使得父元素几乎表现得像display:block,并忽略它被定义为的事实(因为父元素display:inline现在只包含匿名元素)和非匿名阻止子,即它不再包含任何内联子项)?

我的问题是,在这种情况下(有display:block孩子的地方)那么父母的定义之间有什么区别display:inline而不是display:block


编辑:我更了解CSS 2.1标准,而不是各种浏览器实现在实践中的表现.


第二编辑:

规范中有一个区别.在下面的文档中,第二个"块"段的边框围绕整个段落和页面的整个宽度; 而第一个'内联段落的边框是在段落内的每一行(即使有多行),并且不超过每行的确切宽度(每行比页面宽度短).

<html>
<head>
<style type="text/css">
p.one 
{
border-style:solid;
border-width:1px;
display: inline;
}
p.two 
{
border-style:solid;
border-width:1px;
}
</style>
</head>
<body>
<p class="one">Some text. <b>Note:</b> The "border-width"
property does not work if it is used alone. Use the …
Run Code Online (Sandbox Code Playgroud)

css inline

30
推荐指数
2
解决办法
2万
查看次数

如何在CSS中使用'hover'

我使用下面的代码来实现这个目标:

当鼠标悬停在锚点上时,下划线出现,

但它失败了,

    <a class="hover">click</a>

    a .hover :hover{
        text-decoration:underline;
    }
Run Code Online (Sandbox Code Playgroud)

什么是正确的版本?

css anchor hover

29
推荐指数
4
解决办法
13万
查看次数

HTML <code>标记内的颜色(语法高亮显示)

在如下代码片段中......

class Foo
{
  internal Foo()
  {
    for (int i = 0; i < 42; ++i);
  }
}
Run Code Online (Sandbox Code Playgroud)

...当它们在我的浏览器中显示时,它的各种关键字等都会进行颜色编码.

当我执行"查看源代码"时,我没有看到HTML中有任何特殊内容可以实现此颜色编码.

然后,如何和/或在何处实现这种特定于语法的颜色突出显示?例如,它内置于浏览器中,还是通过特定于站点的JavaScript编辑浏览器中的DOM来实现?

我觉得这对谷歌来说是个难题.

html syntax-highlighting color-coding

24
推荐指数
2
解决办法
3万
查看次数

如何测试CSS选择器性能?

我将如何测试不同css选择器的性能基准?我读过类似的文章这样.但我不知道它是否适用于我的网站,因为他使用了一个包含20000个类和60000个DOM元素的测试页.

我是否应该关心,根据您采取的css策略,性能是否真的降级了很多?

举个例子,我喜欢这样做......

.navbar { background:gray; }
.navbar > li { display:inline;background:#ffffff; }

<ul class="navbar">
  <li>Menu 1</li>
  <li>Menu 2</li>
  <li>Menu 3</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

......但我能做到这一点......

.navbar { background:gray; }
.navbar-item { display:inline;background:#ffffff; }
<ul class="navbar">
  <li class="navbar-item">Menu 1</li>
  <li class="navbar-item">Menu 2</li>
  <li class="navbar-item">Menu 3</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

有些人会说(也可能是对的)第二种选择会更快.

但是如果你在所有页面上乘以第二种方法,我会发现以下缺点:

  1. 页面大小将增加,因为所有元素都有类
  2. css类的数量可能会变得非常大,这需要更多的css类解析

我的页面似乎是~8KB,有~100个DOM元素.

所以我真正的问题是如何创建一个测试床,我可以根据实际网页大小的策略测试性能增量?具体来说,我如何知道页面显示需要多长时间?JavaScript的?怎么样?

欢迎提供帮助和简单的意见!

html css performance

23
推荐指数
1
解决办法
6747
查看次数

文本节点后第一个块的边距(垂直空间)?

第一个问题:

里面的块如<dd><td>或者<li>,我是说得很对,下面的一个或两个是正常的,正确的吗?

<td>
  An introductory sentence as a text node.
  <p>A further sentence as a paragraph.</p>
</td>
Run Code Online (Sandbox Code Playgroud)

和/或:

<td>
  <p>An introductory sentence as a paragraph.</p>
  <p>A further sentence as a paragraph.</p>
</td>
Run Code Online (Sandbox Code Playgroud)

第二个问题:

假设是这样,我可以使用什么CSS来确保在两种情况下两个句子之间有差距,而不是在第一句话之前?

我的问题是,如果我做的事情......

td > p { margin-top: 1em; }
Run Code Online (Sandbox Code Playgroud)

...当第一个句子是文本节点时,这可以正常工作,但是<td>当第一个句子在段落内时,它会在第一个句子和包含之间放置不需要的边距.

我想要一个解决方案,即使第一个句子包含内联元素,如<strong><a href="...">.


总之CSS应该产生相同的布局,如下,供双方的两个HTML例子:

-- top of <td> here
-- no margin here
-- first sentence here (whether it's a text node …
Run Code Online (Sandbox Code Playgroud)

html css

21
推荐指数
1
解决办法
650
查看次数

如何在 TypeScript 中定义不透明类型?

如果我没记错的话,在 C++ 中你可以定义一个像这样的不透明类型......

class Foo;
Run Code Online (Sandbox Code Playgroud)

...并像句柄一样使用它,例如在声明函数签名时...

void printFoo(const Foo& foo);
Run Code Online (Sandbox Code Playgroud)

然后,应用程序代码可能会在没有看到 Foo 的实际定义的情况下使用对 Foo 的引用或对 Foo 的指针。

TypeScript 中是否有类似的东西——你会如何定义一个不透明的类型?

我的问题是,如果我定义这个......

interface Foo {};
Run Code Online (Sandbox Code Playgroud)

...然后可以与其他类似类型自由互换。有成语吗?

typescript

21
推荐指数
1
解决办法
4890
查看次数