我只需要在单元测试中模拟外部依赖吗?
如果我想测试的方法依赖于同一个程序集中的另一个类,该怎么办?我是否必须模拟依赖关系以确保只测试一件事并进行单元测试而不是集成测试?
集成测试是一般测试依赖项的测试,还是我必须区分内部和外部依赖项?
一个例子是一个方法,它有2000行代码和5个方法调用(所有方法来自同一个程序集).
以下是失败的集成测试的伪代码:
[测试]
void TestLogger()
// Init static logger
Logger.Init(pathToFile);
// Create five threads that will call LogMessages delegate
for i = 1 to 5
{
Thread aThread = new Thread(LogMessages)
aThread.Start(i);
}
// let threads complete their work
Thread.Sleep(30000);
/// read from log file and count the lines
int lineCount = GetLineCount();
// 5 threads, each logs 5 times = 25 lines in the log
Assert.Equal(25, lineCount);
static void LogMessages( object data )
// each thread will log five messages …Run Code Online (Sandbox Code Playgroud) 我是单元测试的新手.我想知道如何使用python单元测试对下面的代码进行单元测试.您可以使用任何类型的框架进行测试,但请注意提及原因和详细信息.真的很感谢大家的帮助.
顺便说一句,你可以对代码进行更改,只要它现在正在做的事情.无论如何它是BS:P
pyg = 'ay'
original = raw_input('Enter a word:')
word = original.lower()
first = word[0]
if first == "a" and "e" and "i" and "o" and "u":
new_word = word + pyg
print new_word
else:
consonant_fix = word[1:]
new_word = consonant_fix + word[0] + pyg
print new_word
Run Code Online (Sandbox Code Playgroud) 我有这样的测试方法
[TestMethod]
public void TestMethod1()
{
var smthing= new doSmthing();
smthing.doSomefunction("Test Service","Test Operation");
// do something next
var 2ndsmthing = do2ndSmthing();
2ndsmthing.do2ndSomeThing("Test","Method")
}
Run Code Online (Sandbox Code Playgroud)
相信我这两个函数或调用需要在同一个测试方法下如何在调用第一个方法时如果出现问题就能阻止测试停止?即在调用doSmthing()时,我听说在测试方法中使用Try ... Catch块是一个坏主意.我怎么解决这个问题?
任何想法真的很感激.
我有一个默认为空白的span元素,并在页面由javascript加载时更新.这很好用 - 但是assert_select似乎只能获得初始HTML - 在页面加载完成之前.这是预期的行为吗?我究竟做错了什么?
脚手架中的span元素生成_form.html.erb:
...
<span id="confirm_loaded"></span>
...
Run Code Online (Sandbox Code Playgroud)
----在app/assets/javascripts的.js文件中:
$(function(){
$("#confirm_loaded").html("test");
});
Run Code Online (Sandbox Code Playgroud)
----当我加载页面时 - 页面通过javascript更新,一切都很好.
但是,在集成测试中 - 这一行:
assert_select "span#confirm_loaded", {text: "test"}
Run Code Online (Sandbox Code Playgroud)
失败并出现错误:
<test> expected but was
<>..
Expected 0 to be >= 1.
Run Code Online (Sandbox Code Playgroud)
这似乎证实测试没有看到javascript设置更新的HTML元素(也许它在页面完全加载之前运行?)
快速更改页面,删除JavaScript并对HTML进行硬编码:
...
<span id="confirm_loaded">test</span>
...
Run Code Online (Sandbox Code Playgroud)
现在测试通过(assert_select能够获得值,我们是金色的).
assert_select只能获取HTML标签的初始值吗?为什么assert_select 在页面加载时没有通过javascript更新值?
谢谢你的帮助.
javascript integration-testing ruby-on-rails ruby-on-rails-4
我们有一个包含多个子模块的EAR项目(多个EJB,Web项目,应用程序客户端等).单一测试的自然范围是它们各自的子模块(因为它们应该是测试隔离单元).
在很短的时间内,我们引入了非明显的测试依赖项.项目正在嘲笑来自其他项目的功能等.很快我们的架构演变成了几个带有模拟的独立jar文件(web项目1个模拟,ejb 2模拟等); 我们将这些模拟与EAR连接起来并消耗子模块中的模拟("瘦战"风格).
EAR
Modules
WEB 1
WEB 2
EJB 2
EJB 3
etc
Libs
Shared library 1
Shared Library 2
Testing dependencies
WEB 1 mocks
WEB 2 mocks
EJB 1 mocks
EJB 2 mocks
etc
WEB1
Uses EJB 1 and EJB 3
Uses Shared Library 1
Testing
Consumes EJB 1 and EJB 2 mocks
Run Code Online (Sandbox Code Playgroud)
无论如何,我们团队的共识是模拟失控.我们希望向Arquillian发展并在容器内部进行测试(例如,向集成测试).我们还介绍了ATTD(最初只是使用Drone进行功能测试,但我希望尽快安装功能齐全的Thucydidies + JBehave或EasyB).
测试可能取决于来自多个子模块的资源.ShrinkWrap可以保证事情不会失控.
所以我的问题是:我应该在哪里放置测试,故事,Arquillian配置文件等等?
我觉得EAR是分组一切的最佳场所:
EAR
Modules
Test
src
Java
Test 1
Test 2
Resources
Configuration Files
Stories
Story 1
Story 2 …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写集成测试,以查看是否从URL正确下载了文件.我不确定如何测试这个,因为我希望在byte []中获取文件,但我不确定我正在比较它的图像.我想过手动下载文件,然后将其转换为字节并获取结果并将其粘贴到代码中作为预期值,然后将其与我得到的结果进行比较.如果你有更好的主意,我会很高兴听到它.
谢谢:)
在旅途中编程语言,第11.2.4节,存在的一个外部测试接入功能的一个例子fmt.isSpace()通过的声明IsSpace中fmt的export_test.go文件.这似乎是完美的解决方案,所以这就是我所做的:
a/a.go:
package a
var x int
func Set(v int) {
x = v
}
Run Code Online (Sandbox Code Playgroud)
a/a_test.go:
package a
import "testing"
func TestSet(t *testing.T) {
Set(42)
if x != 42 {
t.Errorf("x == %d (expected 42)", x)
}
}
func Get() int {
return x
}
Run Code Online (Sandbox Code Playgroud)
(运行go test中a/工作正常.)
b/b.go:
package b
import "path/to/a"
func CallSet() {
a.Set(105)
}
Run Code Online (Sandbox Code Playgroud)
b/b_test.go
package b
import (
"testing" …Run Code Online (Sandbox Code Playgroud) 我刚刚用 .net core 2.0 创建了一个空的 web api 项目。我有一个默认控制器,现在我想创建一个集成测试。
[Route("api/[controller]")]
public class ValuesController : Controller
{
// GET api/values
[HttpGet]
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
}
Run Code Online (Sandbox Code Playgroud)
目标是集成中的自托管,然后输入 url api/values 并检查返回。
注意:我只使用 wep api 2 和 owin,这很容易做到。但是以下链接:https : //docs.microsoft.com/en-us/aspnet/core/fundamentals/owin说.net core 应用程序不应该使用owin,那么我们应该使用什么以及如何使用呢?
我正在尝试为 Spring Boot 2 应用程序编写集成测试。
一项测试应测试通过 REST 更新值。
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureTestEntityManager
@Transactional
public class TenantEndpointIT {
@Autowired
private TestRestTemplate template;
@Autowired
private TestEntityManager entityManager;
@Test
public void nok_updateValueForbidden() {
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我认为最TestEntityManager简洁的方法是在 @Before 方法中创建值,然后在实际测试中测试 REST 端点。
但是REST Endpoint 调用的服务使用 Spring Caching 注释进行了注释。所以如果我这样做,测试就会失败。我可以直接使用该服务或进行第二次 REST 调用。这会给使用相同值的其他测试带来问题,因为即使回滚数据库,缓存似乎也包含该值。(现在我正在使用@DirtiesContext)。
我的问题是,您如何正确地将测试服务与 @Cachable 集成?有没有办法获取缓存并显式放置/删除?我尝试自动装配 CacheManager,但它找不到并且失败了。